1009 數字1的數量
阿新 • • 發佈:2019-01-28
給定一個十進位制正整數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示例
12Output示例
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; }