
本文介绍如何用java编写程序,处理任意数量的非负整数输入,实时计算并输出最大值与保留两位小数的平均值;关键在于正确处理输入终止逻辑、避免整数除法截断,并使用浮点运算保障精度。
本文介绍如何用java编写程序,处理任意数量的非负整数输入,实时计算并输出最大值与保留两位小数的平均值;关键在于正确处理输入终止逻辑、避免整数除法截断,并使用浮点运算保障精度。
在实际编程练习(如高校Lab作业或在线评测系统)中,常需处理“可变长度输入”场景:用户连续输入若干非负整数,以首个负数作为输入结束标志,该负数不参与统计。本题要求输出两个结果——所有有效输入中的最大值和平均值(保留两位小数)。
核心问题解析
原代码存在三个关键缺陷:
- 数据类型不匹配:avg 声明为 int,但 System.out.printf("%.2f\n", avg) 要求传入 float 或 double 类型,否则将导致编译错误或运行时异常(如 IllegalFormatConversionException);
- 整数除法截断:total / (count - 1) 是整数除法,即使 total=38、count-1=4,结果也为 9(而非 9.5),丢失小数部分;
- 初始逻辑偏差:循环体中先执行 total += num 和 count++,再读取新 num,导致第一个输入被错误累加两次(初始 num = 0 被计入 total 和 count)。
正确实现方案
以下为修正后的完整代码,已通过典型测试用例验证(如输入 15 20 0 3 -1 → 输出 20 9.50):
import java.util.Scanner;
public class LabProgram {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
int num = scnr.nextInt(); // 首次读取,避免初始0干扰
if (num < 0) {
// 题目保证至少有一个非负数,此分支理论上不触发,但增强鲁棒性
System.out.println("No valid input.");
return;
}
int max = num;
int total = num;
int count = 1;
while (true) {
num = scnr.nextInt();
if (num < 0) {
break; // 负数终止输入,不参与统计
}
if (num > max) {
max = num;
}
total += num;
count++;
}
// 关键:使用 float 或 double 进行除法,防止整数截断
float average = (float) total / count;
// 按题目要求格式化输出:最大值 + 空格 + 平均值(两位小数)
System.out.print(max + " ");
System.out.printf("%.2f\n", average);
}
}关键注意事项
- ✅ 输入顺序必须严格遵循题意:首次输入即为有效数据,不可预设 num = 0 后再读取;
- ✅ max 初始化为首个有效输入值,而非 0,否则当所有输入均为 0 时(如 0 0 0 -1),max 仍为 0 是正确的;但若输入含负数前导(如题目不允许),初始化方式更安全;
- ✅ average 必须声明为 float 或 double,且除法操作中至少一个操作数需显式转换为浮点类型(如 (float)total / count),否则 Java 默认执行整数除法;
- ⚠️ printf 中的 %.2f 自动四舍五入,符合题目“两位小数”要求,无需手动处理精度;
- ? 若需更高精度(如金融计算),建议改用 double 和 BigDecimal,但本题 float 已完全满足。
该实现简洁、健壮、符合题目约束,是处理动态输入统计类问题的典型范式——把握输入边界、选择合适数据类型、精准控制运算精度,即可高效达成目标。
立即学习“Java免费学习笔记(深入)”;










