1. 程式人生 > >劍指offer-面試題32.從1到n整數中1出現的次數

劍指offer-面試題32.從1到n整數中1出現的次數

題目:輸入一個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字中1,10,11和12,1一共出現了5次

本題可以直接變數1到n的n個數然後分別計算每個數中1的個數,然而這種方法是效率很低下的書上給出了一共方法,去找數n各個位置上出現1的規律,在這裡我就不再描述具體的規律推倒過程,只是給出這樣一個普遍性的規律。

1.對每一位上面的數字,當該數字等於零時,該位上1的個數等於 高位*該位的位數

2.對每一位上面的數字,當該數字等於1時,該位上1的個數等於  高位*該位的位數+低位數加1

3.對每一位上面的數字,當該數字等於非0非1時,該位上1的個數等於  (高位+1)*該位的位數

例如52014

該數字十位數為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 }
複製程式碼

執行截圖: