题目意思:求a到b之间[0..9]这十个数字出现的次数 递归解法 #include <cstdio> int getbit(int num) { int i; for(i = 1; num/i > 9; i *= 10); return i; } int fn(int num, int n) // 算num有多少个 n { int bit = getbit(num); int sum = 0; if(bit==1) { if(num >= n) return 1; else return 0; } else { int e = num/bit; for(int i = 1; i <= e; ++i) { if(i==e) // 最后一个 { sum += fn(num%bit, n); if(i==n) sum += num%bit + 1; } else // 不是最后一个 { if(i==n) sum += bit ; } } sum += fn(bit - 1, n)*e; // 加的是i-1 到 i 的这段 } return sum; } int getamount(int num) { int rs = 1; int amount = 0; while(rs != num) { amount++; rs *= 10; } return amount; } int fill(int bit) { int sum = 0; while(bit) { sum += bit/10; bit /= 10; } return sum; } int fn1(int num) // 算 num 有多少个 n { int mod, bit_of_mod, d; int bit = getbit(num); int sum = 0; if(bit==1) return 1; else { int e = num/bit; mod = num%bit; if(getbit(mod) >= bit/10) // 中间没 0 { sum += fn1(mod); sum += fill(bit) - 1; // 应该没问题 } else // 中间有 0 { bit_of_mod = getbit(mod); d = getamount(bit/10) - getamount(bit_of_mod); sum += d * (mod + 1); // 补中间的 0 sum += fill(bit_of_mod*10); // 补中间的 0 sum += fn1(mod) - 1; } sum += fn1(bit - 1)*e; // 低一位的的统计 sum += (fill(bit) - 1)*(e - 1); // 补前面的 0 } return sum; } int list1[10], list2[10]; int main() { int a,b; while(scanf("%d%d", &a, &b) && !(a==0 && b==0)) { if(b < a) a ^= b ^= a ^= b; list1[0] = fn1(a - 1); list2[0] = fn1(b); for(int i = 1; i < 10; ++i) { list1[i] = fn(a - 1, i); list2[i] = fn(b, i); } for(int i = 0; i < 10; ++i) { printf("%d ", list2[i] - list1[i]); } printf("/n"); } return 0; }