这个题的意思是分别求 0 - 9 在 1 - n中出现的个数,是个数位动态规划的内容,难度还是比较大的。
题目
特殊情况:
如果g
如果g>x,yyyyyy∈[000000,abcdef] , ans += abcdef+1
3) 如果我们枚举的数是0的话 :
0不能在第一位
而且枚举到的这一位前面不能全是0,即
xxx∈[001,abc-1]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(System.out);
public static void main(String[] args) throws IOException {
String[] s;
while (true) {
s = br.readLine().split(" ");
int a = Integer.parseInt(s[0]);
int b = Integer.parseInt(s[1]);
if (a == 0 && 0 == b) break;
if (a > b) {
int temp = a;
a = b;
b = temp;
}
for (int i = 0; i <= 9; i++) pw.print(count(b, i) - count(a - 1, i) + " ");
pw.println();
}
pw.flush();
pw.close();
br.close();
}
public static int count(int n, int x) {
if (n == 0) return 0;
ArrayList<Integer> nums = new ArrayList<>();
while (n != 0) {
nums.add(n % 10);
n /= 10;
}
n = nums.size();
int res = 0;
int bit = x == 0 ? 1 : 0;
for (int i = n - 1 - bit; i >= 0; i--) {
if (i < n - 1) {
res += get(nums, n - 1, i + 1) * Math.pow(10, i);
if (x == 0) res -= Math.pow(10, i);
}
if (nums.get(i) > x) res += Math.pow(10, i);
else if (nums.get(i) == x) res += get(nums, i - 1, 0) + 1;
}
return res;
}
public static int get(ArrayList<Integer> al, int l, int r) {
int res = 0;
for (int i = l; i >= r; i--) res = res * 10 + al.get(i);
return res;
}
}