数学 之 hdu 4722

//  [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\n", i, ans);
51     }
52     return 0;
53 }

 

posted @ 2014-07-13 10:42  JmingS  阅读(114)  评论(0编辑  收藏  举报