【发布时间】:2014-04-10 22:06:51
【问题描述】:
我需要计算一个大素数模的阶乘。 我的程序可以达到某些值,但是当我达到程序中提到的更高值时它会失败(分段错误)。
我怎样才能使这个程序工作?
非常感谢
#define LL unsigned long long
#define ull unsigned long long
const LL mod=1000000009;
LL arr[1048580];
inline ull mulMod(ull a,ull b,ull c)
{
if(a<=1000000000ULL && b<=1000000000ULL)
{
//cout<<((a%c)*(b%c))%c<<endl;
ull ret = ((a%c)*(b%c))%c;
return ret;
}
ull ret = 0ULL; a=a%c;
while(b > 0ULL)
{
if(b&1ULL) ret = ((ret%c)+(a%c))%c;
a = (a<<1ULL)%c;
b>>=1ULL;
}
return ret%c;
}
LL fact(LL num)
{
if(arr[num]==0)
{
arr[num]=mulMod(num,fact(num-1),mod);
return arr[num];
}
return arr[num];
}
int main()
{
arr[0]=1;
cout<<fact(325720);
}
【问题讨论】:
-
段错误发生在哪里?
-
由于
fact(n)递归调用fact(n-1),通过调用fact(325720),您正在向系统请求大小为325720 的调用堆栈。这是行不通的。它太大了。 -
你为什么使用
#define来表示类型别名(可怕的想法!),为什么同一事物有两个不同的名称?
标签: c++ segmentation-fault factorial