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

使用循环计算1到n的和时大n值结果异常的技术咨询

问题原因:整数溢出

正确结果参考

1到100000的和用数学公式计算应为:(100000 * 100001) / 2 = 5000050000,但你的程序输出705082704,核心问题是整数溢出。

具体分析

  • 你声明的sum是long类型,在多数32位系统或部分64位编译环境中,long是32位整数,最大值仅为2^31 - 1 = 2147483647。而5000050000远大于这个上限,当sum累加超过最大值时,会发生溢出回绕,最终得到错误的结果。
  • 虽然当前测试的n=100000在int类型的容纳范围内(32位int最大值为2147483647),但如果后续传入更大的n,int n也会出现溢出,直接破坏循环逻辑。

修复方案

  1. 改用大整数类型:将sum、n、i都改为long long类型(64位整数,最大值为9223372036854775807,完全能覆盖更大范围的求和需求):
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    long long sum = 0;
    long long n = atoll(argv[1]);
    for(long long i = 1; i<= n; i++)
        sum += i;
    printf("Sum of serial from 1 to %lld = %lld\n", n, sum);
    return 0;
}
  1. 用公式替代循环:求和公式n*(n+1)/2可以避免循环,同时通过类型转换防止中间计算溢出:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    long long n = atoll(argv[1]);
    long long sum = (n * (n + 1)) / 2;
    printf("Sum of serial from 1 to %lld = %lld\n", n, sum);
    return 0;
}

修改后运行./sum 100000,就能得到正确的结果5000050000。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:48:34