/*程式設計之美系列:
*///
01 一的數目:
#include
using
namespace
std;
//暴力:
/*int f(int n)
n/=10;
}return count;}*/
//數學思想
/*假設n=abcde為乙個整數,a,b,c,d,e分別對應十進位制數,如果要計算(1到n)百位出現1的個數,他將受三個因素的影響:百位以上的數,百位數和百位一下的數,具體依賴如下:
分別設整數n百位以上,百位和百位一下的數字分別為:prenum,curnum,pronum,如n=abcde的三個值分別為:
prenum=ab
curnum=c
pronum=de
分三種情況討論百位上的數字出現1的計數(用onecount表示)
情況1:百位數字為0(curnum=0),onecount=prenum*100;
情況2:百位數字為1(curnum=1),onecount=prenum*100+pronum+1;
情況3:百位數字大於1(curnum>1),onecount=(prenum+1)*100;
其他位計算1出現的個數類似
* 對於數abcde,c這位出現1的次數分以下情況:
* 1.若c > 1,結論是(ab + 1)* 100;
* 2.若c == 1,結論是(ab)* 100 + de + 1;
* 3.若c < 1,結輪是 ab * 100 + de + 1;
*/int f (int
n) t*=10
; }
return
count;
}int
main()
程式設計之美 1的數目
我一上來就是遍歷著計算,但在面試或者應用中決計是不可行的。我們換一種思路,乙個數abcdefg,我們計算出各位,十位,百位。有多少個1,加一起即可。就23012來說,看百位上它為0,從1 23012中,百 位上有多少個1取決於比它高的所有位決定。100 199,1100 1199,2100 2199...
程式設計之美 1的數目
給定乙個十進位制正整數n,寫下從1開始,到n的所有整數,然後數一下其中出現的所有 1 的個數。解法一 窮舉法,遍歷1到n的每乙個數,計算其出現1的整數的個數 雖然笨,但是想不出其他方法就這樣了 解法二 分類討論,分別討論個位,十位和百位.上1能出現的次數。假設這個數為abcd,則 d 為1時,出現1...
程式設計之美 1的數目
問題1描述 求1 n十進位制中1的數目f,f 12 5 include typedef long long ll ll sum1s ll n ifactor 10 return icount int main 2 求滿足f n n的最大數 找規律 9以下 1個 99以下 20個 999以下 300個...