題目:輸入一個整數n,求從1到n這n個整數的十進制表示中1出現的次數。例如輸入12,從ios
1到12這些整數中包含1的數字中1,10,11和12,1一共出現了5次spa
本題能夠直接變量1到n的n個數而後分別計算每一個數中1的個數,然而這種方法是效率很低下的code
書上給出了一共方法,去找數n各個位置上出現1的規律,在這裏我就再也不描述具體的規律推倒blog
過程,只是給出這樣一個廣泛性的規律。ci
1.對每一位上面的數字,當該數字等於零時,該位上1的個數等於 高位*該位的位數input
2.對每一位上面的數字,當該數字等於1時,該位上1的個數等於 高位*該位的位數+低位數加1it
3.對每一位上面的數字,當該數字等於非0非1時,該位上1的個數等於 (高位+1)*該位的位數io
例如52014class
該數字十位數爲1,那麼十位上1的個數=(520)*10+(4+1)=5205效率
該數字百位數爲0,那麼百位上1的個數=(52)*100=5200
該數字千位數爲2,那麼千位上1的個數=(5+1)*1000=6000
該數字個位數爲4,那麼個位上1的個數=(5201+1)*1=5202
該數字萬位上爲5,那麼萬位上1的個數=(0+1)*10000=10000
那麼1-52014中全部1的個數爲:5205+5200+6000+5202+10000=31607
實現代碼以下:
1 #include <iostream> 2 using namespace std; 3 4 int CountOneSum(int Number) 5 { 6 int HighPos=0; 7 int LowPos=0; 8 int count=0; 9 int CurrPos=0; 10 11 int k=1; 12 13 while(Number/k!=0) 14 { 15 LowPos=Number-(Number/k)*k; 16 CurrPos=(Number/k)%10; 17 HighPos=Number/(k*10); 18 19 switch(CurrPos) 20 { 21 case 0: 22 count+=(HighPos*k); 23 break; 24 case 1: 25 count+=(HighPos*k+LowPos+1); 26 break; 27 default: 28 count+=((HighPos+1)*k); 29 } 30 31 k=k*10; 32 } 33 return count; 34 } 35 36 int main (int argc, char* argv[]) 37 { 38 int num; 39 cout<<"Please input the number you want to count '1': "; 40 cin>>num; 41 int OneCount=0; 42 OneCount=CountOneSum(num); 43 cout<<"The Count of '1' is: "<<OneCount<<endl; 44 system("pause"); 45 return 0; 46 }
運行截圖: