请问我是否可以就我可能做错了什么提出意见。
我正在尝试运行我的内部 for
循环10000
次,但是在第一次打印出来之后,我得到无穷大作为打印值。
#include <stdio.h>
int i, f = 1;
float calculation = 0;
int main()
{
for(int j=0; j<=10000; j++)
{
for(i=1; i<=19; i++)
{
f = f * i;
calculation += 1.00 / f;
}
printf("Factorial calculation is 1/ %d!=%f\n", i, calculation);
}
return 0;
}
最佳答案
您有一个整数溢出。看,您将 f
定义为 int
int i, f = 1;
和f
增长得很快,变得巨大,最后一定是(19!)^10000
(相当大的19!
提升为 10000
次方);但是,int
值不能大于2^31 - 1
,因此会出现整数溢出(您可能会得到负数值,然后正一,零)。
当i == 18
,j == 1
出现时,f == 0
,从现在开始,你就拥有了
// when i == 18, j = 1 we have f == 0 due to integer overflow
calculation += 1.00 / f;
等于无穷大。
快速修改是将f
声明为float
:
int i;
float f = 1.0;
计算仍然效率低下,但计算
现在有效。
calculation == 1.7182816
编辑:注意,f
增长得很快,在 j = 2
处,i = 8
我们有 f == infinity
。从现在开始我们开始什么都不做:
1.00 / infinity == 0
这就是原因
calculation += 1.00 / f;
等于
calculation += 0;
我们可以很好地重写
// we don't want add 0 9997 times
for(int j=0; j<=10000; j++) ...
进入(我们想要的只是最多 4
个外循环,而不是 10000
)
for(int j=0; j<=3; j++) ...
关于c - 嵌套for循环,运行系列10000次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70204867/