C或C++程序设计 求大数阶乘

2024-11-12 06:49:14
推荐回答(3个)
回答1:

//输入阶乘数,先计算结果的位数,再动态申请相应的空间,用字符数组保存结果。
int input;
cin >> input;
double numlen = 1.0;
for(int temp=1; temp<=input; temp++)
numlen += log10((double)temp);
cout << (int)numlen << endl;
char *result = new char[(int)numlen+1];
result[(int)numlen] = '\0';
result[0] = '1';
int lenght = 1;
clock_t start,end;
start = time(0);
for (int i = 1; i<=input; i++)
{
int c = 0; //进位标志
for (int j=0; j {
int buf = (result[j]-'0') * i + c; //计算结果
result[j] = buf % 10 + '0'; //取当前位
c = buf / 10; //计算进位
}
while (c)
{
result[lenght++] = c % 10 +'0'; //取当前位
c /= 10; //计算进位
}
}
end = time(0);

for (int k=lenght-1; k>=0; k--)
{
cout< }
cout< cout << difftime(end, start) << endl;
cout<<"length="< delete[] result;
要算出100000!要366秒,比较久,不知道有没有别的方式,这个只是按位计算的!

回答2:

我用C++做了1000!的大数阶乘,读出到文件中。运算是对的,只是和你的一点细节要求是有点不符的比如要求输入阶乘数,还有空格分隔,持续及退出等。你可以自己看看,做点小改动符合你的要求就行了。有意的百度加我,请报上原因,如:大数阶乘请教

回答3:

//才100以内啊。这个很强的,自己拿去看看吧。以前在网上找的/*=====================================================================*/
/* 阶乘计算器,来自 http://unix-cd.com/vc/www/23/2009-02/13349.html */
/*=====================================================================*/
#include
/*----------------------------------------------------------------------*/
/*SK-CHINA 阶乘计算器*/
/*本程序可以准确计算十万以内的阶乘*/
/*结果输出为out.txt*/
long s[500000]={0L}; /*存储数据*/
long h=499999L; /*数据位置*/
int cheng(long num) {
long t=499999L;
while(s[h]==0) h++;
if(num>=100000L) h--;
if(num>=10000L) h--;
if(num>=1000L) h--;
if(num>=100L) h--;
if(num>=10L) h--;
h--;
while(t!=h) {
s[t]=s[t]*num;
t--;
} t=499999L;
h=h-5L;
while(t!=h) {
s[t-1]+=s[t]/10;
s[t]=s[t]%10;
t--;
}
h=h+5L;
}
int main(void) {
int i;
long x;
FILE *output;
s[499999]=1L;
output=fopen("out.txt","w");
printf("SK-CHINA 阶乘计算器\n请输入数据:");
scanf("%ld",&x); /*输入数据*/
for(i=1;i<=x;i++) { cheng(i); printf("\r当前已计算至%ld!",i); }
printf("\n计算结束,现在程序正在把结果保存到out.txt\n");
for(i=0;i<500000L;i++) {
if(i%500==0) fprintf(output,"\n");
fprintf(output,"%ld",s[i]);
}
printf("写入结束!\n");
return 0;
}
/*=====================================================================*/