正整数数组求最大和返回负数,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
相关产品推荐
相关产品推荐

