UVa 10994 - Simple Addition
2015-12-11 11:59
1391 查看
题目:求区间[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防止溢出。
分析:数论。我们把数字按位数划分分别计算即可。
如果,我们求出从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; }
相关文章推荐
- iOS应用架构谈 (3)网络层设计方案
- 日期间隔之年、月、日、时、分、秒
- [LeetCode]Compare Version Numbers
- LeetCode - 15. 3Sum
- TCL: 事务控制语言
- jQuery+CSS实现环形进度条
- 任务三 非人物分析判断
- Mybatis foreach 项目实战
- Android 代码中实现返回键功能
- iOS应用架构谈 -(2)view层的组织和调用方案
- 【JOB】Oracle中JOB的创建方法以及一个细节的探究
- pl/sql预定义异常处理
- oracle跨库查询dblink的用法实例详解
- itunes下载的软件怎么安装到手机
- ORACLE SQL Developer日期显示格式设置
- 逆转字符串——输入一个字符串,将其逆转并输出。
- corosync集群的选举算法
- word-wrap和word-break的区别吗?
- Oracle JOB的建立,定时执行任务
- LeetCode - 14. Longest Common Prefix