#include<stdio.h>
int main()
{
int t,carry=0,i,j=1,index,x,no=1;
int c;
scanf("%d",&t);
int a[200]={0};
a[0]=1;
for(i=1;i<=t;i++)
{
index=0;
no=j;
carry=0;
while(index<no)
{
x=a[index]*i+carry;
a[index]=x%10;
j++;
if(x!=0)
carry=x/10;
index++;
}
while(carry!=0)
{
a[index]=carry%10;
j++;
carry/=10;
index++;
}
}
j=199;
printf("\n");
while(j>=0)
{
printf("%d",a[j]);
j--;
}
scanf("%d",&c);
return 0;
}
这段代码给了我正确的答案直到8阶乘,对于9及以上我得到的答案是362230 是什么原因??? 顺便说一下,我知道它可以用Java或其他语言轻松实现,但我想使用这种方法,所以请不要建议。我找不到bug。代码在gcc中运行,但在ideone上出错,不要知道为什么。 救命啊!
答案 0 :(得分:2)
抛开样式问题以及以十进制数字存储大整数的事实相当浪费,问题是你永远不会重置j
。因此,循环
while(index<no)
{
x=a[index]*i+carry;
a[index]=x%10;
j++;
if(x!=0)
carry=x/10;
index++;
}
表示j
在每次乘法中至少加倍,在其中八次之后,j
将大于您存储的数组中的200个元素阶乘的数字。然后,用
no=j;
的
while(index<no)
{
x=a[index]*i+carry;
a[index]=x%10;
将读取和写入都超出数组的范围。
解决此问题的侵入性最小的方法是
while(carry!=0)
{
a[index]=carry%10;
j++;
carry/=10;
index++;
}
j = index; // <--- add this here.
请注意,这会让您失去基本的死代码;在循环中计算j
没有任何意义。