c - 嵌套for循环,运行系列10000次

标签 c for-loop nested

请问我是否可以就我可能做错了什么提出意见。 我正在尝试运行我的内部 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 == 18j == 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/

相关文章:

c++ - 大数排列 nPr 的最佳程序

javascript - JSPerf、For 循环与 While 循环

r - 更新R中嵌套循环中的列表

java - 检查表达式在括号方面是否平衡

nested - 嵌套元素的 Hammerjs 事件顺序

elasticsearch - Elasticsearch 中的嵌套过滤具有多个相同嵌套类型的术语

函数指针可以用来运行 "data"吗?

C程序卡住,甚至不进入主程序

windows %PATH% 变量 - 如何在 CMD shell 中再次拆分 ';'

从 ‘int’ 转换为 ‘float’ 可能会改变它的值