Java程序逻辑错误排查:查找满足双整除条件的数字
问题排查与修复方案
咱们先拆解下你代码里的逻辑问题,这就是为啥只输出30、33的根源:
核心错误点
- 错误的个位筛选条件:你写的
if(i%10==z)里,z初始值是0,这就意味着只有个位为0的数字才会进入后续判断,像36、39的个位是6、9,根本触发不了这个条件,自然不会被输出。 - 无效的判断语句:
if(z%x==0);后面多了个分号,这会让这个判断变成空语句——不管条件成不成立,都不会执行任何后续逻辑,等于白写了。 - 混乱的数字拆分逻辑:你只粗暴处理了十位和个位,没有循环检查每一位数字(要是遇到三位数、四位数就彻底失效了),而且拆分的顺序和判断逻辑完全乱套,没覆盖所有位的检查。
- 遗漏了核心条件:你的代码里完全没加
i%x == 0这个判断——也就是数字本身能被X整除的条件,虽然例子里X=3,30、33刚好满足,但逻辑上是缺失的。
修复后的完整代码
我们重新梳理逻辑:先判断数字本身是否能被X整除,再拆分它的每一位,确保每一位都能被X整除。
import java.util.Scanner; public class ShipmentNumberChecker { public static void main(String args[]) { int m, n, x = 3; Scanner sc = new Scanner(System.in); System.out.println("Enter the range for shipment numbers :"); m = sc.nextInt(); n = sc.nextInt(); System.out.println("Possible shipment numbers :"); for (int i = m; i <= n; i++) { // 先快速过滤:数字本身不能被X整除的直接跳过 if (i % x != 0) { continue; } // 拆分每一位数字,检查是否都能被X整除 boolean allDigitsValid = true; int temp = i; while (temp > 0) { int digit = temp % 10; if (digit % x != 0) { allDigitsValid = false; break; // 有一位不满足,直接终止检查 } temp = temp / 10; // 去掉已经检查过的个位 } // 所有条件都满足才输出 if (allDigitsValid) { System.out.println(i); } } sc.close(); } }
代码逻辑说明
- 前置过滤:先判断数字本身是否能被X整除,不满足的直接跳过,减少不必要的计算。
- 逐位检查:用临时变量
temp存储当前数字,通过temp%10取出个位,temp/10去掉个位,循环直到temp变为0——不管是几位数都能完美处理。 - 状态标记:用
allDigitsValid标记是否所有位都符合要求,只要有一位不满足就立刻终止检查,提升效率。 - 输出结果:只有当数字本身和所有位都满足条件时,才输出该数字。
测试你给出的30-40范围,这段代码会正确输出30、33、36、39。
内容的提问来源于stack exchange,提问作者luciferxxx
相关产品推荐
相关产品推荐

