You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言嵌套for循环输出无穷大 代码问题排查求助

问题原因分析
  • 变量未重置:全局变量f、calculation没有在每次外层循环开始前重置初始值。第一次内层循环跑完后f已经是19!的结果,下一轮循环会直接在这个基础上继续乘1~19,数值快速爆炸。
  • 整数类型溢出:32位有符号int的最大取值仅为2147483647,13!就已经超过这个上限,第一次内层循环运行到i=13时就已经触发整数溢出,属于C语言未定义行为,f的值会完全异常。
  • 浮点精度不足:float类型的精度和取值范围有限,数值溢出后就会被表示为无穷大。
修复方案

如果需要保持原有逻辑(外层跑10001次,每次内层计算1/1!到1/19!的和),可以做如下修改:

  1. 将f、calculation的定义放到外层循环内部,每次循环重置初始值
  2. 把f的类型改为64位长整型long long,可容纳19!的计算结果
  3. 把calculation改为精度更高的double类型

修复后代码如下:

#include <stdio.h>

int main()
{
    for(int j=0; j<=10000; j++)
    {
        long long f = 1;
        double calculation = 0;
        int i;
        for(i=1; i<=19; i++)
        {
            f = f * i;
            calculation += 1.0 / f;
        }
        printf("第%d次计算:1/%d!=%lf,累加和为%lf\n", j+1, i-1, 1.0/f, calculation);
    }
    return 0;
}
扩展优化(适配内层循环跑10000次的需求)

如果实际需求是内层循环计算1/1!到1/10000!的和,用整数存阶乘会很快溢出,可改用递推法直接计算每一项,无需存储完整阶乘,不会触发溢出:

#include <stdio.h>

int main()
{
    for(int j=0; j<=10000; j++)
    {
        double calculation = 0;
        double term = 1.0;
        int i;
        for(i=1; i<=10000; i++)
        {
            term /= i;
            calculation += term;
        }
        printf("第%d次计算:1/10000!累加和为%.15lf\n", j+1, calculation);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者NewCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:24:03