1009 数字1的数量
来源:互联网 发布:冬天帽子 知乎 编辑:程序博客网 时间:2024/05/21 09:47
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
OutPut
输出包含1的个数
Input示例
12
Output示例
5
用f(n) 表示1-n所有数字中1的总数,len表示数字n的位数,g(x)表示n数字n的第x位,g(len-1) > 1有f(n) = pow(10,len-1) + g(len-1)*f(pow(10,len-1)-1) + f(n - pow(10,len-1)*g(len-1)),g(len-1) =1 时有 f(n) = f(pow(10,len-1)-1) + f(n - pow(10,len-1)*g(len-1)) + n - pow(10,len-1)*g(len-1)+1。
例:8718,f(8718) = pow(10,3) + 8*f(pow(10,3)-1) + f(718),然后递归...
1718,f(1718) = f(pow(10,3)-1) + f(718) + 718+1
代码如下:
#include <iostream>#include <algorithm>using namespace std;int getIthNumber(int value,int iTh){//value的iTh位,如8718,iTh=3,返回7 int res = 0; int index = 0; while(value){ index ++; if(iTh == index) { res = value % 10; break; } value = value/10; } return res;}int lengthOfNumber(unsigned int value){ int len = 0; while(value){ len++; value = value/10; } return len;}int NumberOfDigit1(int value){if (value <1) return 0;if(value <=9) return 1;int len = lengthOfNumber(value);int ithNumber = getIthNumber(value,len);int x = pow(10,len-1);int res = 0;int rest = value - ithNumber * x;if(ithNumber>1) res = x + ithNumber * NumberOfDigit1(x-1) + NumberOfDigit1(rest);else{ res = ithNumber * NumberOfDigit1(x-1) + NumberOfDigit1(rest) + rest + 1 ;}return res;}int main(){ int n; cin>>n; cout<<NumberOfDigit1(n)<<endl; return 0;}
0 0
- 1009 数字1的数量
- 1009 数字1的数量
- 1009 数字1的数量
- 1009 数字1的数量
- 1009 数字1的数量
- 1009 数字1的数量
- 数字1的数量
- 数字1的数量
- 数字1的数量
- 数字1的数量
- 数字1的数量
- 数字1的数量
- 数字1的数量
- 数字1的数量
- 数字1的数量
- 51nod 1009:数字1的数量
- 51NOD 1009 数字1的数量
- 51nod 1009 数字1的数量
- 如何更安全的使用Block
- nginx转发规则
- UE4.5.0的Kinect插件(Plugin)<一>
- swift 随机背景色的实现
- IAR的工程配置
- 1009 数字1的数量
- hash 与 随机数(二)
- VS2010进行远程调试方法总结
- แทงบอลออนไลน์สนุกตื่นเต้นเล่นง่าย
- 【hibernate框架】各种问题用注解Annotation和mxl配置的解决
- LeetCode 初体验,卒。
- Linux系统下卸载DB2数据库软件
- 时间处理工具类TimeUtil
- 9.2.1、Libgdx的输入处理之轮询