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

正整数数组求最大和返回负数,C语言代码问题求助

数组求和出现负数的问题分析

问题描述

这段代码的功能是对正整数数组排序后,计算minimum_sum(数组前n-1个元素的和)与maximum_sum(数组后n-1个元素的和)。例如输入数组[5,4,3,2,1],排序后可得min_sum=1+2+3+4=10,max_sum=5+4+3+2=14,多数场景下运行正常。但输入元素为140537896、243908675、670291834、923018467、520718469时,本该返回min=1575456874、max=2357937445,实际却返回min=1575456874、max=-1937029851,需排查错误原因。

原代码

#include <stdio.h>

int sort(int n, long int arr[n])
{
    int aux;

    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1; j++)
        {
            if (arr[j + 1] < arr[j])
            {
                aux = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = aux;
            }
        }
    }
    return 0;
}

void sum(int n, long int arr[n])
{
    long int min_sum = 0;
    long int max_sum = 0;
    for (int i = 0; i < n - 1; i++)
    {
        min_sum = min_sum + arr[i];
    }
    printf("min sum is : %ld \n", min_sum);
    for (int i = n - 1; i > 0; i--)
    {
        max_sum = max_sum + arr[i];
    }
    printf("max sum is : %ld",max_sum);
}

int main()
{
    int n;
    printf("----MIN MAX---- \n");
    do {
        printf("Enter n : ");
        scanf("%d", &n);
    } while (n <= 0);
    long int arr[n];
    for (int i = 0; i < n; i++)
    {
        printf("Enter arr[%d]: ", i);
        scanf("%ld", &arr[i]);
    }
    sort(n, arr);
    sum(n, arr);
}

错误原因

1. 排序函数的变量类型不匹配

sort函数中用于交换数组元素的aux被定义为int类型,但数组元素是long int类型。当数组元素值超过int的范围(通常为-2147483648到2147483647)时,赋值给aux会发生整数截断溢出,导致元素值被错误修改,最终排序结果异常,影响求和计算。

2. 32位long int的数值溢出问题

在32位系统中,long int的最大值为2147483647,而本次计算的max_sum=2357937445已经超过该上限。对于有符号整数,溢出属于未定义行为,数值会按补码规则循环,最终得到负数结果:2357937445 - 4294967296 = -1937029851,与实际输出一致。

修复方案

  • 将sort函数中的aux变量类型改为long long int,避免交换时的类型溢出。
  • 把数组元素类型、求和变量min_sum/max_sum改为long long int(64位整数,最大值为9223372036854775807,足够容纳大数求和),同时输入输出格式符对应改为%lld。

修复后的代码:

#include <stdio.h>

int sort(int n, long long int arr[n])
{
    long long int aux;

    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1; j++)
        {
            if (arr[j + 1] < arr[j])
            {
                aux = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = aux;
            }
        }
    }
    return 0;
}

void sum(int n, long long int arr[n])
{
    long long int min_sum = 0;
    long long int max_sum = 0;
    for (int i = 0; i < n - 1; i++)
    {
        min_sum = min_sum + arr[i];
    }
    printf("min sum is : %lld \n", min_sum);
    for (int i = n - 1; i > 0; i--)
    {
        max_sum = max_sum + arr[i];
    }
    printf("max sum is : %lld", max_sum);
}

int main()
{
    int n;
    printf("----MIN MAX---- \n");
    do {
        printf("Enter n : ");
        scanf("%d", &n);
    } while (n <= 0);
    long long int arr[n];
    for (int i = 0; i < n; i++)
    {
        printf("Enter arr[%d]: ", i);
        scanf("%lld", &arr[i]);
    }
    sort(n, arr);
    sum(n, arr);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:45:21