Java逐行比较两数计算较大值数位和时结果累加问题解决
问题根因
代码运行结果不符合预期,由三个明确的编码错误导致:
- 求和变量
sum定义在for循环外层,生命周期覆盖所有循环迭代,上一行计算得到的sum值不会清空,下一行计算时会基于历史值继续累加,直接导致第二行结果变成第一行、第二行计算值的总和。 - 循环边界条件错误:写为
i <= 2时循环会执行3次,对应示例只有2行输入的场景,第三次循环会读取空内容触发解析报错。 - 用
double浮点数类型存储输入整数、做取模/除法运算存在天然精度风险,浮点数无法精确表示所有整数,运算过程中可能出现尾值误差,导致数位计算逻辑出错。
修复方法
核心调整三点:
- 将
sum变量的定义移动到for循环内部,保证每处理一行输入时,sum都从0开始独立计算,不同行的计算结果互不干扰 - 修正循环边界,固定2行输入时用
i < 2即可,动态行数场景改用scanner.hasNextLine()做循环判断条件 - 替换浮点数类型为整数类型(int/long,根据输入数字大小选择)存储输入值,避免浮点数精度问题,也可以直接用
Math.max()方法取两数较大值,简化分支判断逻辑
修复后的可运行代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 示例为2行输入,动态读取所有行可替换为 while (scanner.hasNextLine()) for (int i = 0; i < 2; i++) { // 每行独立初始化求和变量,初始值为0 int sum = 0; String line = scanner.nextLine().trim(); // 跳过空行避免解析报错 if (line.isEmpty()) continue; String[] numParts = line.split("\\s+"); long left = Long.parseLong(numParts[0]); long right = Long.parseLong(numParts[1]); long max = Math.max(left, right); while (max > 0) { sum += max % 10; max = max / 10; } System.out.println(sum); } scanner.close(); } }
补充说明
- 如果输入可能包含负整数,取最大值后要先调用
Math.abs()取绝对值再计算数位和,避免负数取模得到负值导致求和结果错误。 - 拆分输入字符串时用
split("\\s+")可以兼容多空格、制表符分隔的场景,比单空格分隔的鲁棒性更强。
内容的提问来源于stack exchange,提问作者user7110057
相关产品推荐
相关产品推荐

