UVA 10994 Simple Addition
2011-12-19 23:19
309 查看
UVA_10994
这个题目一开始WA了几次,抱着侥幸的心理把几个感觉可以是int的也改成了long long int了,没想到AC了,后来发现可能是一个乘法的细节溢出了,以后一定得多注意这类的问题,避免中间结果溢出。
下面说这个题目的思路吧,其实对于个位1-9都是一样的,只不过10的倍数变化比较大,于是我们不妨先算完个位不为0的,然后把区间除以10,这样新区间里面剩下的就都是10的倍数了,然后再不断重复前面的操作就可得到最后的结果,注意最后区间长度小于10的时候就直接把他们的和算出来就可以了。
这个题目一开始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; }
相关文章推荐
- uva 10994 - Simple Addition
- UVA - 10994 Simple Addition
- UVa 10994 - Simple Addition
- UVA 10994 Simple Addition
- UVa 10994 - Simple Addition
- uva 10994 - Simple Addition(规律)
- uva 10994 Simple Addition
- uva 10994 - Simple Addition(规律)
- UVA 10994 Simple Addition
- uva10994 - Simple Addition
- uva 10994 - Simple Addition
- UVa OJ 10994-Simple Addition
- 10994 - Simple Addition(规律)
- 10994 - Simple Addition(规律)
- uva 10994
- UVa 10994 Simple Addition (组合数学)
- uva 10994
- UVA 4757 Open-air shopping malls
- UVa 567 - Risk
- Central Europe 1996 / UVa 311 / POJ 1017 Packets (贪心)