//由RoBa程序改变,感谢 /* 题目描述: 给你两个数 a 和 b , 请你计算 a b 之间所有数的数字之和 输入: 多组测试数据,每个数据仅一行 一行有两个数 a,b (0 <= a,b <= 2e9 ) 以EOF结束输入 输出: a b 之间的数的数字之和 样例输入: 0 3 10 14 0 0 样例输出: 6 15 0 其它信息: Contest 14 比赛题 题目提供:ailyanlu 提示:第二个例子中 a = 10, b = 14 , ans = (1+0)+(1+1)+(1+2)+(1+3)+(1+4) = 15 难度:Hard */ /* 解析 考虑 n = (n/10) * 10 + n % 10; 函数f(n,d) 为1到n中含数字d的个数 考虑 1到n可以表示为 1 2 3 4 5 6 7 8 9 然后是 1* 10 + 1, 2 * 10 +1, 3 * 10 +1, ..., (n/10) * 10 + 1, ... 1* 10 + 9, 2 * 10 +9, 3 * 10 +9, ..., (n/10) * 10 + 9, 1* 10 + 0, 2 * 10 +0, 3 * 10 +0, ..., (n/10) * 10 + 0, 对于第d行,所含的d的个数是 n / 10 + f(n/10,d), 其他9行共得到9*(n/10,d); 但是我们从1算到了(n/10)*10+9,多算了n+1到(n/10)*10+9里面所含的数字d 用f2(n,d)为n中所含数字d个数 */ #include <cstdio> #include <algorithm> using namespace std; typedef __int64 LL; int f2(int n, int d) { int r = 0; while (n) { if (n%10 == d) r++; n /= 10; } return r; } LL f(int n, int d) { if (n < 10) return n >=d && d; int sum = 0; for (int i = n + 1; i <= (n/10)*10 + 9; ++i) sum += f2(i,d); return n/10 + 10 * f(n/10,d)-sum + 1; } int main() { int a,b,i; LL tot; while (scanf("%d%d",&a,&b) != EOF) { if (a > b) swap(a,b); tot = 0; for (i = 1; i < 10; ++i) { tot += i * (f(b,i) - f(a-1,i)); } printf("%I64d/n",tot); } return 0; }