计算高达 100 的阶乘的代码中存在错误?
Bug in the code to calculate factorials upto 100?
#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 或其他语言实现,但我想使用这种方法所以请不要建议 that.I 找不到 bug.The 代码在 gcc 中运行但是ideone 报错,不知道为什么。
求助!
抛开风格问题和以十进制数字存储大整数相当浪费的事实,问题是您永远不会重置 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
没有任何意义。
#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 或其他语言实现,但我想使用这种方法所以请不要建议 that.I 找不到 bug.The 代码在 gcc 中运行但是ideone 报错,不知道为什么。 求助!
抛开风格问题和以十进制数字存储大整数相当浪费的事实,问题是您永远不会重置 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
没有任何意义。