// [7/13/2014 Sjm]
/*
规律:
[xxxx0, xxxx9] (指十位及更高位都相等但仅有个位不同的连续10个数字),一定仅有一个满足数位之和整除10
于是:
对于所给数[a, b],
判断a值是否个位为0,若否:将a值不断加1,并赋值给A,直至A个位为 0;
判断b值是否个位为9,若否:将b值不断减1,并赋值给B,直至B个位为 9。
故答案由三部分加和:
1)[a, A) 满足数位之和整除10的数字个数
2)(B, b] 满足数位之和整除10的数字个数
3) [A, B] 满足数位之和整除10的数字个数 <= 由规律知道,个数为 (B-A+1)/10
****编代码时,注意区间[a, b], (b-a)<9 的处理****
*/
1 #include <iostream>
2 #include <cstdlib>
3 #include <cstdio>
4 using namespace std;
5 typedef __int64 int64;
6
7 bool Judge(int64 num)
8 {
9 int sum = 0;
10 while (num){
11 sum += (num % 10);
12 num /= 10;
13 }
14 return (!(sum % 10));
15 }
16
17 int main()
18 {
19 //freopen ("input.txt", "r", stdin);
20 int64 a, b;
21 int N;
22 scanf("%d", &N);
23 for (int i = 1; i <= N; i++) {
24 scanf("%I64d %I64d", &a, &b);
25 int64 ans = 0;
26
27 int t_a = a % 10;
28 int t_b = b % 10;
29
30 while (t_a != 0 && a <= b) {
31 if (Judge(a)) {
32 ans++;
33 }
34 a++;
35 t_a = a % 10;
36 }
37
38
39 while (t_b != 9 && a <= b) {
40 if (Judge(b)) {
41 ans++;
42 }
43 b--;
44 t_b = b % 10;
45 }
46
47 if ((b - a) >= 9) {
48 ans += ((b - a + 1) / 10);
49 }
50 printf("Case #%d: %I64d
", i, ans);
51 }
52 return 0;
53 }