找1的个数
課堂練習——得出“1”的個數
2015-05-03 20:30 by 奔波兒灞,?5?閱讀,?0?評論,?收藏,?編輯
題目:給定一個十進制的正整數,寫下從1開始,到N的所有整數,然后數一下其中出現“1”的個數。
要求:寫一個函數 f(N) ,返回1 到 N 之間出現的 “1”的個數。例如 f(12)? = 5。在32位整數范圍內,滿足條件的“f(N) =N”的最大的N是多少。
一、設計思路
? ? ? 首先,此題可以用從1到N遍歷一遍的方法來解決。即輸入一個數除以10取余數,如果余數等于1則計數加1,否則計數加0,然后此數除以10,直到此數除以10結果等于0。然而,此種方法多做了很多無用功。我們做練習的目的并不是實現程序,而是學會各種算法來優化程序。所以,此題第二種解法則是統計各種情況下,“1”個數的變化規律。
? ? ? 規律變化:
? ? ? ? ? ? ? ? ? f(3)=1;
? ? ? ? ? ? ? ? ? f(13)=2+1;f(23)=3+10;f(33)=4+10;f(43)=5+10;f(53)=6+10;f(63)=7+10;……;f(93)=10+10;
? ? ? ? ? ? ? ? ? f(103)=11+10+4;f(113)=12+12+14;f(123)=13+20+24;……
? ? ? ? ? ? ? ? ? ……
? ? ??通過對數字進行有規律的總結,發現從1到N,中出現的所有的1的總數。可以從N這個數總結出來的。
? ? ? f(N)=個位上出現1的次數+十位上出現1的次數+百位上出現1的次數+……
? ? ? 所以對于一個數abcde,取百位上的c來計算,
? ? ? 假若c是"1",那么百位上1的個數是由他的高位和低位來決定的。等于ab*100+cde+1;
? ? ? 假若c是"0",那么百位上1的個數是ab*100;
? ? ? 假如c是大于1,那么 百位上1的個數是(ab+1)*100;
二、源代碼
1 #include <iostream.h> 2 int f(int n) 3 { 4 int Count=0; 5 int Factor=1; 6 int LowerNum=0; 7 int CurrNum=0; 8 int HigherNum=0; 9 while(n/Factor!=0) 10 { 11 LowerNum=n-(n/Factor)*Factor; 12 CurrNum=(n/Factor)%10; 13 HigherNum=n/(Factor*10); 14 switch(CurrNum) 15 { 16 case 0: 17 Count+=HigherNum*Factor; 18 break; 19 case 1: 20 Count+=HigherNum*Factor+LowerNum+1; 21 break; 22 default: 23 Count+=(HigherNum+1)*Factor; 24 break; 25 } 26 Factor*=10; 27 } 28 return Count; 29 } 30 int main() 31 { 32 int num; 33 cout<<"請輸入十進制整數:"<<endl; 34 cin>>num; 35 cout<<f(num)<<endl; 36 return 0; 37 }三.結果截圖
轉載于:https://www.cnblogs.com/yue3475975/p/4587558.html
總結
                            
                        - 上一篇: Python3.4连接Mysql
 - 下一篇: 生成Geometry