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

计算大整数数组平均值出现负数,怀疑存在整数溢出问题

整数数组大数平均值计算问题解答

1. 确实是整数溢出导致的问题

在大多数系统中,int是32位有符号整数,取值范围为**-2147483648 到 2147483647**。你的数组中每个元素是2000000000,三个元素总和为6000000000,远超过int的最大值。

有符号整数溢出属于C语言的未定义行为,但实际运行中通常会按补码规则回绕:数值超过最大值后,会从最小值开始重新计数,因此sum最终会变成负数,用负数除以3自然得到错误结果。

2. 不使用double的正确修改方案

有两种可靠的解决思路:

方法一:用更大容量的整数类型存储总和

将sum的类型改为long long(至少64位有符号整数),它能容纳远大于6000000000的数值。修改后的代码如下:

#include <stdio.h>

int main() {
    int arr[] = {2000000000, 2000000000, 2000000000};
    int n = 3;
    long long sum = 0;  // 改为long long类型
    
    for (int i = 0; i < n; i++) {
        sum += arr[i];
    }
    
    printf("Average = %lld\n", sum / n);  // 用%lld格式化输出long long
    return 0;
}

此方法能避免总和溢出,计算出的平均值为正确的2000000000。

方法二:逐元素迭代计算平均值(避免累加大数)

若不想使用更大的整数类型,可通过迭代公式计算平均值,每次仅处理一个元素,避免产生超大累加和。核心公式为:current_avg = current_avg + (arr[i] - current_avg) / (i+1)。修改后的代码:

#include <stdio.h>

int main() {
    int arr[] = {2000000000, 2000000000, 2000000000};
    int n = 3;
    int avg = 0;
    
    for (int i = 0; i < n; i++) {
        avg += (arr[i] - avg) / (i + 1);
    }
    
    printf("Average = %d\n", avg);
    return 0;
}

该方法不会产生超出int范围的中间值,适用于数组元素总和超int但单个元素与平均值仍在int范围内的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 04:53:11