符合特定条件的6位数字组合数计算Java代码问题求助
问题描述
6位数字组合的条件
- 所有数位均不为0
- 每位数字互不相同
- 该6位数能被每一位数字整除
输入输出要求
- 输入:两个整数L和H,分别为范围下限和上限
- 输出:区间[L,H]内符合条件的数字个数C
现有代码问题
我原本想靠数组做条件校验,但没法统计组合数;改用循环实现又卡壳了,只完成了输入和L≤H的判断,附上自己写的Java代码,求帮忙修正实现需求:
public static void main(String[] args) { Scanner FF = new Scanner(System.in); List<Integer> result = new ArrayList<>(); int l = FF.nextInt(); int h = FF.nextInt(); for (int i = l; i <= h; i++) { result.add(i); } for (int i=l; i<=h; i++){ if (result.get(i) == result.get(i)){ result.remove(i); } int temp = result.get(i); while (result.get(i)>0){ int k = result.get(i)%10; if (temp % k != 0){ result.remove(i); } } if (String.valueOf(result.get(i)).contains("0")){ result.remove(i); } } System.out.println(result); }
代码修正方案
你的代码主要问题在于List索引逻辑错误、无意义判断、遍历修改List导致的混乱,以及条件校验逻辑的错误。以下是修正后的代码,直接统计符合条件的数字个数:
import java.util.Scanner; public class ValidSixDigitCounter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int l = scanner.nextInt(); int h = scanner.nextInt(); int count = 0; // 遍历区间内的每个数字 for (int num = l; num <= h; num++) { // 仅处理6位数(若输入范围确保都是6位,可删除此判断) if (num < 100000 || num > 999999) { continue; } if (isValid(num)) { count++; } } System.out.println(count); scanner.close(); } // 校验单个数字是否符合所有条件 private static boolean isValid(int num) { boolean[] digitUsed = new boolean[10]; // 标记0-9是否已出现 int temp = num; // 校验条件1(数位不为0)和条件2(数字不重复) while (temp > 0) { int digit = temp % 10; if (digit == 0 || digitUsed[digit]) { return false; } digitUsed[digit] = true; temp /= 10; } // 校验条件3(能被每一位数字整除) temp = num; while (temp > 0) { int digit = temp % 10; if (num % digit != 0) { return false; } temp /= 10; } return true; } }
修正说明
- 索引逻辑修复:放弃用List维护所有数字再移除的方式,改用计数器直接统计符合条件的数字,避免索引越界和遍历修改List的问题。
- 条件校验重构:把三个条件的校验封装到
isValid方法中,逻辑更清晰:- 用
digitUsed数组快速判断数字是否重复,同时检查数位是否为0; - 单独遍历数位校验整除性,提前终止不符合条件的判断,提升效率。
- 用
- 鲁棒性提升:增加6位数判断,避免处理非6位的数字(若题目输入范围明确是6位,可删除此判断)。
内容的提问来源于stack exchange,提问作者Marcus Stills
相关产品推荐
相关产品推荐

