一、題目與要求
題目:給定一個十進制的正整數,寫下從1開始,到N的所有整數,然後數一下其中出現“1”的個數。
要求:1.寫一個函數 f(N) ,返回1 到 N 之間出現的“1”的個數。例如 f(12) = 5。
2.在32位整數范圍內,滿足條件的“f(N) =N”的最大的N是多少。
二、設計思路
第一種思路:
模10,除10取余,然後尋找規律,
9%10=9、9/10=0;
11%10=1、11/10=1;
15%10=5、15/10=1;
······
然後寫了很多,想到如果模10等於0怎麼辦?等於1怎麼辦?取余怎麼辦,判斷條件怎麼寫?
搗鼓了好長時間沒有弄明白。
第二種思路(老師上課講的思路):
f(13)=2+4=6
f(23)=3+10=13
f(33)=4+10=14
f(93)=10+10=20 …… 某一位上1的個數與其位上的數字、其高一位上的數字、其低一位上的數字數字有關,最後編程實現如下: 三、源代碼 1 //hanxuedong
2
3 #include<iostream.h>
4 int Count(int n)
5 {
6 int count=0; //對1的個數計數
7 int now=1; //N由最低位到最高位此時對應第now位
8 int l=0; //第now位的低一位的數字
9 int nownum=0; //第now位的數字
10 int h=0; //第now位的高一位的數字
11 if(n<=0)
12 {
13 return 0;
14 }
15 while(n/now!=0)
16 {
17 l=n-(n/now)*now;
18 nownum=(n/now)%10;
19 h=n/(now*10);
20 if(nownum==0)
21 {
22 count+=h*now;
23 }
24 else if(nownum==1)
25 {
26 count+=h*now+l+1;
27 }
28 else
29 {
30 count+=(h+1)*now;
31 }
32 now*=10;
33 }
34 return count;
35 }
36 void main()
37 {
38 int number;
39 cout<<"請輸入數字:";
40 cin>>number;
41 cout<<"0--"<<number<<"中1出現的次數為:"<<Count(number)<<endl;
42 }
四、運行結果



五、心得體會
像這一類的題目,找到規律很重要,找到規律就對代碼實現以及代碼優化就會有很大的幫助,面對不要急著上來就寫代碼,一定要先在下邊動手寫寫,尋找以下規律。