题目解析
输出 之间所有满足前 位数能被 整除的数。
解题思路
搜索
从最高位开始依次找到前位能被整除的数,直到填满位为止。
由于给定的可能是一个差距极大值,所以需要先替换为位数的最大最小值。即 。
代码
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);
}