积累1数
2015-12-11 12:55
309 查看
http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=2154
如以下的问题:特定1十进制整数N,从计算1至N所有整数“数字1”出现次数
例如:N=12,序列={1,2,3,4,5,6,7,8,9,10,11,12},当中出现“1”的个数是5。故f(12)=5
解法:对于此题,《编程之美》中给出了一个巧妙的解法。
主要思路是:将总结果拆分成几个结果的和,如对于一个5位的整数abcde,序列中百位上出现1的次数受百位上的数字c影响。千位上出现1的次数受b影响,依此类推;最后将各个数位上1出现的次数加起来即为总和。
归纳总结。分成下面三种情况:以百位上的数字c为例:
1.假设c=0。则1在百位出现的次数受高位上的数字影响,为高位数字ab*100(100为当前乘数因子,在个位时为1,十位为10,百位为100等等)
2.假设c=1;则1在百位出现的次数既受高位影响,也受低位影响,高位影响的个数为高位数字ab*100(当前因子)。低位影响的个数为低位数字de+1
3.假设c>1。则1在百位出现的次数仅受高位上的数字影响。为(ab+1)*100(当前因子)
cpp代码:
如以下的问题:特定1十进制整数N,从计算1至N所有整数“数字1”出现次数
例如:N=12,序列={1,2,3,4,5,6,7,8,9,10,11,12},当中出现“1”的个数是5。故f(12)=5
解法:对于此题,《编程之美》中给出了一个巧妙的解法。
主要思路是:将总结果拆分成几个结果的和,如对于一个5位的整数abcde,序列中百位上出现1的次数受百位上的数字c影响。千位上出现1的次数受b影响,依此类推;最后将各个数位上1出现的次数加起来即为总和。
归纳总结。分成下面三种情况:以百位上的数字c为例:
1.假设c=0。则1在百位出现的次数受高位上的数字影响,为高位数字ab*100(100为当前乘数因子,在个位时为1,十位为10,百位为100等等)
2.假设c=1;则1在百位出现的次数既受高位影响,也受低位影响,高位影响的个数为高位数字ab*100(当前因子)。低位影响的个数为低位数字de+1
3.假设c>1。则1在百位出现的次数仅受高位上的数字影响。为(ab+1)*100(当前因子)
cpp代码:
#include <iostream> using namespace std; int CountOne(int num){ int mod,cnt=0,factor=1; int tmp=num; while(num!=0){ mod=num%10; switch(mod){ case 0: cnt+=(tmp/(factor*10))*factor; break; case 1: cnt+=(tmp/(factor*10))*factor+(tmp%factor)+1; break; default: cnt+=(tmp/(factor*10)+1)*factor; break; } num/=10; factor*=10; } return cnt; } int main(){ int n; while(cin>>n){ cout<<CountOne(n)<<endl; } return 0; }
相关文章推荐
- php laravel 帧 该文件上传
- Hadoop教程(二):安装
- sh: symbol lookup error: sh: undefined symbol: rl_signal_event_hook错误
- js及jquery获取页面和元素的宽高
- Hadoop教程(一):简介、大数据解决方案、介绍快速入门
- iOS判断一个字符串中是否都是数字
- Java工程师成神之路~
- 计算定积分
- Mybatis的原理、搭建与使用
- 画图板的改进和多态
- knockout之入门介绍
- php创建空对象
- learn python the hard way(笨办法学python) 练习32 附加练习
- MYSQL查看表格字段属性
- ecshop商品分类页获取相册列表方法
- 追求Masonry(看过最好的masonry中文博文)
- jsp版计算器
- 关于机器学习
- Android开发笔记(十六)秋千摇摆动画SwingAnimation
- SpringMVC+Volley实现Android端上传文件