計算從1到整數N之間的全部整數,1出現的次數。記爲f(N).算法
好比12:1,10,11,12 1出現5次。spa
【思路】code
1.常規解法,先計算任意一個整數N中所含的1的個數,好比13含1個1,而後再套一個從1到N的循環,計算每一個數出現1的次數。blog
2.總結規律。it
f(N)=個位出現1的個數+十位出現1的個數+百位出現1的個數+.....class
eg:N=123;循環
個位出現1的次數與十位數的關係:總結
個位數字=0:十位數(的個數)di
個位數字>=1:十位數+1while
十位出現1的次數與個位數的關係:
十位數字=1:個位數+1
十位數字>1:(百位數+1)*10
總結:每位上出現1的次數會受到三個因素影響:該位上的數字、該位如下(低位)上的數字、該位以上(高位)上的數字。
【code in the book】
int count1inInteger(int n) { int icount=0; int ilower=0; int icurr=0; int ihigher=0; int ifactor=1; while(n/ifactor!=0){ ilower=n-(n/ifactor)*ifactor; icurr=(n/ifactor)%10; ihigher=n/(ifactor*10); switch(icurr){ case 0: icount+=ihigher*ifactor; break; case 1: icount+=ihigher*ifactor+ilower+1; break; default: icount+=(ihigher+1)*ifactor; break; } ifactor*=10; } return icount; }
【總結】
算法很棒,但規律難發現,更難整合到幾行代碼中。