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

C语言阶乘计算出现负数结果,请求代码问题排查帮助

问题排查与修正

你的代码存在三个核心问题,直接导致了异常输出:

1. 循环条件依赖被修改的变量,导致循环无法正常终止

在foo函数的循环for (int i = 1; i < x; i++)中,你在循环体里不断执行x = x * i修改x的值。原本你想计算4的阶乘,但修改后的x增长速度远快于i,循环会一直执行直到x因为整数溢出变成负数,此时i < x不成立才会终止——这就是你看到一长串输出最后出现负数的原因。

2. 混淆输入参数与结果存储变量

你用同一个变量x既保存原始输入值(用来控制循环次数),又存储阶乘的累积结果,完全打乱了逻辑。正确的做法是保留原始输入值作为循环上限,用单独的变量存储阶乘结果。

3. printf调用格式错误

main函数里的printf(m)是错误用法,printf的第一个参数必须是格式字符串;同时你的foo函数返回0,根本没返回阶乘结果。


修正后的代码

#include <stdio.h>

// 计算n的阶乘,返回结果
long long foo(int n) {
    long long result = 1;
    // 用原始输入n作为循环上限,避免被修改影响
    for (int i = 1; i <= n; i++) {
        result *= i;
        // 可选:打印每一步的累积结果
        printf("%lld ", result);
    }
    return result;
}

int main() {
    int x = 4;
    long long factorial = foo(x);
    // 打印最终结果
    printf("\n%d的阶乘是:%lld\n", x, factorial);
    return 0;
}

额外说明

  • 改用long long类型存储阶乘结果:int的范围通常只能容纳到12!(479001600),13!就会溢出,long long可以支持到更大的数值(最多到20!左右,超过后依然会溢出,需用大数库)。
  • 循环条件改为i <= n:因为n的阶乘是1×2×…×n,包含n本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:05:20