C语言中在阶乘的程序中如何避免中间结果溢出

2024-11-26 23:24:22
推荐回答(3个)
回答1:

使用数组吧,数组的地址是连续的,所以你只需加个判断就可以了,当地位溢出时,高位自动加一的操作,最后想输出结果,那就遍历数组的所以位数,求出来就可以了

回答2:

使用数组,下面的代码是根据计算数的大小,动态分配内存。最大可计算(10^9 -1)! 计算10000的阶乘只要0.5秒!!(计算数n&num小于10^9时,数据类型可以设置为long)

#include
#include
#include
#include
long t=2,a,m;
long long b;
main()
{
///////////////////// prepare /////////////////////
long num = 0;
while(1){
printf("Input a natural number that you want to get its factorial.\n");
scanf("%ld",&num);
getchar();
if(num <0){
printf("Your Input is illegal!\n");
}
else{
break;
}
}
long n = 1000000000; //如果b,s不使用long long数据类型,n&num应不大于10^9,否则出错。
///////////////////// ready ////////////////////////
// 按sizeof(long)==4,sizeof(long long)==8算,
//最大可计算(10^9 -1)! 要求内存够大哦^_^
long long *s = (long long*) malloc(sizeof(long long)*num);
if(NULL == s){
perror("malloc");
return -1;
}
memset(s,0,sizeof(long long)*num);
s[0] = 1;
double start,finish;
start = clock();//计时开始
for(t=2;t<=num;t++){
for(a=0;a<=m;a++){
s[a]=(b+=s[a]*t)%n,b/=n;
if( (m==a) && b)m++;
}
}
for(printf("%d!=%lld",num,s[m]);m--;)printf(“%09lld",s[m]);
printf("\n");

finish = clock();//计时结束
printf("Spended %f seconds to calculate.\n",(finish-start)/CLOCKS_PER_SEC);
free(s);
#if 0
FILE *fp;//也可以输出到文件
if((fp = fopen("/example/save","w+"))==NULL){
printf("open save file error\n");
}
else{
for(fprintf(fp,"%ld",s[m]);m--;)fprintf(fp,"%09ld",s[m]);
}
free(s);
#endif
return 0;
}

回答3:

楼上的说的不错,用一个整型数组来存放就可以了