L2-056 被n整除的n位数 - java

题目解析

输出aba \sim b 之间所有满足前 ii 位数能被 ii 整除的数。

解题思路

搜索

从最高位开始依次找到前ii位能被ii整除的数,直到填满nn位为止。

由于给定的a,ba,b可能是一个差距极大值,所以需要先替换为nn位数的最大最小值。即 a=10n1,b=10n1a = 10^{n-1}, b=10^n-1

代码

import java.io.*;
import java.util.*;

public class Main
{

    static long n, a, b;
    static boolean flag = true;

    // x:当前的数
    // dep:当前填入的位数
    static void dfs(long x, int dep)
    {
        // 填满n位
        if (dep == n)
        {
            // 在指定范围内
            if (a <= x && x <= b)
            {
                flag = false;
                out.println(x);
            }
            return;
        }

        // 依次判断0~9的数是否满足条件
        for (int i = 0; i <= 9; i ++)
        {
            // 将当前数插入
            long res = x * 10 + i;

            // 判断前i位是否为i的倍数
            if (res % (dep + 1) == 0) dfs(res, dep + 1);
        }
    }

    public static void main(String[] args) throws IOException
    {
        n = sc.nextInt();
        a = sc.nextLong();
        b = sc.nextLong();

        // n位数的最小值
        long min = (long) (Math.pow(10, n - 1));

        // 替换a和b的范围
        a = Math.max(a, min);
        b = Math.min(b, min * 10 - 1);

        // 从最高位开始查找,用一个固定值来简化搜索
        for (long i = a / min; i <= b / min; i ++)
            dfs(i, 1);

        if (flag) out.println("No Solution");

        out.flush();
        out.close();
    }

    static Scanner sc = new Scanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);

}

dfs
dfs


团体程序设计天梯赛-练习集-java

赞赏