累积1的数目
来源:互联网 发布:唯品会自动抢购软件 编辑:程序博客网 时间:2024/04/29 18:08
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代码:
#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;}
0 0
- 累积1的数目
- 累积的
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- BOP - 1的数目
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- 1的数目
- 解决Nginx环境下PHP的flush失效问题
- PRML 阅读笔记(十)<3.3-3.6>
- MKAnnotation image offset with custom pin image
- 鄭琢 藥圃 貌類雌龍
- 基于WCF MSMQ 的企业应用解决方案
- 累积1的数目
- MFC中显示沙漏状的鼠标
- 学会用 try,catch语法捕获异常
- Sphinx 配置文件的说明【备忘】
- nginx解析一个命令的多个值
- 底层移植之RBL, UBL, Uboot的关系
- Python文件读写方式
- Git 常用命令总结
- JDBC的fetchsize和maxrows