程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 課堂練習之找數字0-N中“1”出現的次數,課堂0-n

課堂練習之找數字0-N中“1”出現的次數,課堂0-n

編輯:C++入門知識

課堂練習之找數字0-N中“1”出現的次數,課堂0-n


一、題目與要求

題目:給定一個十進制的正整數,寫下從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 }

四、運行結果

五、心得體會

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved