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

題目:輸入一個整數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 }

運行截圖:

相關文章
相關標籤/搜索