UVA_10994
这个题目一开始WA了几次,抱着侥幸的心理把几个感觉可以是int的也改成了long long int了,没想到AC了,后来发现可能是一个乘法的细节溢出了,以后一定得多注意这类的问题,避免中间结果溢出。
下面说这个题目的思路吧,其实对于个位1-9都是一样的,只不过10的倍数变化比较大,于是我们不妨先算完个位不为0的,然后把区间除以10,这样新区间里面剩下的就都是10的倍数了,然后再不断重复前面的操作就可得到最后的结果,注意最后区间长度小于10的时候就直接把他们的和算出来就可以了。
#include<stdio.h>
#include<string.h>
long long int P, Q, res;
long long int F(long long int n)
{
if(n == 0)
return 0;
if(n % 10)
return n % 10;
return F(n / 10);
}
void dfs(long long int x, long long int y)
{
long long int i;
if(y - x < 10)
{
for(i = x; i <= y; i ++)
res += F(i);
return ;
}
for(; x % 10; x ++)
res += F(x);
for(; y % 10; y --)
res += F(y);
res += 45 * ((y - x) / 10);
dfs(x / 10, y / 10);
}
void solve()
{
res = 0;
dfs(P, Q);
printf("%lld\n", res);
}
int main()
{
for(;;)
{
scanf("%lld%lld", &P, &Q);
if(P == -1 && Q == -1)
break;
solve();
}
return 0;
}