数学 之 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 }