Java程序计算五数取四之和的最大最小值为何输出错误?
问题分析与修正方案
首先得揪出你代码里几个关键的bug,这就是导致输出异常的核心原因:
- 初始化与比较逻辑完全错误:你把
maximum和minimum初始为0,而且比较时用了if(compare>sum)——这里的sum已经被重置为0了,等于每次拿当前计算的四数和跟0比,完全没起到更新最大最小值的作用。 - 首次循环未正确赋值:第一次算出的四数和,应该直接赋值给
maximum和minimum作为初始基准,不然初始的0会直接干扰结果判断。
先给你修正后的基础版本代码,解决上述问题:
import java.util.Scanner; public class MiniMaxSum { static void miniMaxSum(int[] arr) { // 用long避免整数溢出,比如五个大数相加可能超出int范围 long currentSum; long maximum = Long.MIN_VALUE; long minimum = Long.MAX_VALUE; // 遍历每个要排除的元素,计算剩余四个的和 for (int i = 0; i < arr.length; i++) { currentSum = 0; for (int j = 0; j < arr.length; j++) { if (i != j) { currentSum += arr[j]; } } // 更新最大值与最小值 if (currentSum > maximum) { maximum = currentSum; } if (currentSum < minimum) { minimum = currentSum; } } System.out.println(minimum + " " + maximum); } private static final Scanner scan = new Scanner(System.in); public static void main(String[] args) { int[] arr = new int[5]; for (int i = 0; i < 5; i++) { arr[i] = scan.nextInt(); } miniMaxSum(arr); } }
另外给你一个更高效的优化方案:其实不需要双重循环。五个数里选四个的和,本质就是总和减去其中一个数。要得到最大和,就去掉数组里最小的元素;要得到最小和,就去掉数组里最大的元素。这样只需要一次遍历就能搞定,时间复杂度从O(n²)降到O(n):
import java.util.Scanner; public class MiniMaxSum { static void miniMaxSum(int[] arr) { long totalSum = 0; long min = Long.MAX_VALUE; long max = Long.MIN_VALUE; // 一次遍历同时计算总和、最大值、最小值 for (int num : arr) { totalSum += num; if (num < min) { min = num; } if (num > max) { max = num; } } long minSum = totalSum - max; long maxSum = totalSum - min; System.out.println(minSum + " " + maxSum); } private static final Scanner scan = new Scanner(System.in); public static void main(String[] args) { int[] arr = new int[5]; for (int i = 0; i < 5; i++) { arr[i] = scan.nextInt(); } miniMaxSum(arr); } }
这个优化后的逻辑更清晰,也不容易出错,推荐使用这种写法~
内容的提问来源于stack exchange,提问作者mighty_leo88
相关产品推荐
相关产品推荐

