You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

符合特定条件的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;
    }
}

修正说明

  1. 索引逻辑修复:放弃用List维护所有数字再移除的方式,改用计数器直接统计符合条件的数字,避免索引越界和遍历修改List的问题。
  2. 条件校验重构:把三个条件的校验封装到isValid方法中,逻辑更清晰:
    • 用digitUsed数组快速判断数字是否重复,同时检查数位是否为0;
    • 单独遍历数位校验整除性,提前终止不符合条件的判断,提升效率。
  3. 鲁棒性提升:增加6位数判断,避免处理非6位的数字(若题目输入范围明确是6位,可删除此判断)。

内容的提问来源于stack exchange,提问作者Marcus Stills

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:31:06