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
原创粉丝点击