题目:求区间[p,q]上,所有数字,最后非零为的和。
分析:数论。我们把数字按位数划分分别计算即可。
如果,我们求出从0到k区间上所有的数字的最后非零位数和,即f(0,k);
那么,f(p,q)= f(0,q)- f(0,p-1);
现在,我们来计算f(0,k),将数字分类:
①位数不是0的数字1,...,9,11,...,19,每10个数字重复计算1,...,9,为45*n/10+sum(n%10);
②最后一位是0的数字10,...,90,110,...,190,除以10和上面相同,为45*n/100+sum(n/10%10);
。。。
按照上面计算直到n/10^k为0,将所有结果加和即可。
说明:注意数据过大,使用long long防止溢出。
#include <cstring>
#include <cstdio>
long long bits(int n)
{
long long sum = 0LL;
while (n > 0) {
sum += 0LL+(n%10)*(n%10+1)/2;
sum += 45LL*(n/=10);
}
return sum;
}
int main()
{
int m, n;
while (~scanf("%d%d",&m,&n) && m >= 0 && n >= 0)
printf("%lld\n",bits(n)-bits(m-1));
return 0;
}