找1的个数
課堂練習(xí)——得出“1”的個(gè)數(shù)
2015-05-03 20:30 by 奔波兒灞,?5?閱讀,?0?評(píng)論,?收藏,?編輯
題目:給定一個(gè)十進(jìn)制的正整數(shù),寫下從1開始,到N的所有整數(shù),然后數(shù)一下其中出現(xiàn)“1”的個(gè)數(shù)。
要求:寫一個(gè)函數(shù) f(N) ,返回1 到 N 之間出現(xiàn)的 “1”的個(gè)數(shù)。例如 f(12)? = 5。在32位整數(shù)范圍內(nèi),滿足條件的“f(N) =N”的最大的N是多少。
一、設(shè)計(jì)思路
? ? ? 首先,此題可以用從1到N遍歷一遍的方法來解決。即輸入一個(gè)數(shù)除以10取余數(shù),如果余數(shù)等于1則計(jì)數(shù)加1,否則計(jì)數(shù)加0,然后此數(shù)除以10,直到此數(shù)除以10結(jié)果等于0。然而,此種方法多做了很多無用功。我們做練習(xí)的目的并不是實(shí)現(xiàn)程序,而是學(xué)會(huì)各種算法來優(yōu)化程序。所以,此題第二種解法則是統(tǒng)計(jì)各種情況下,“1”個(gè)數(shù)的變化規(guī)律。
? ? ? 規(guī)律變化:
? ? ? ? ? ? ? ? ? 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;……
? ? ? ? ? ? ? ? ? ……
? ? ??通過對(duì)數(shù)字進(jìn)行有規(guī)律的總結(jié),發(fā)現(xiàn)從1到N,中出現(xiàn)的所有的1的總數(shù)。可以從N這個(gè)數(shù)總結(jié)出來的。
? ? ? f(N)=個(gè)位上出現(xiàn)1的次數(shù)+十位上出現(xiàn)1的次數(shù)+百位上出現(xiàn)1的次數(shù)+……
? ? ? 所以對(duì)于一個(gè)數(shù)abcde,取百位上的c來計(jì)算,
? ? ? 假若c是"1",那么百位上1的個(gè)數(shù)是由他的高位和低位來決定的。等于ab*100+cde+1;
? ? ? 假若c是"0",那么百位上1的個(gè)數(shù)是ab*100;
? ? ? 假如c是大于1,那么 百位上1的個(gè)數(shù)是(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<<"請(qǐng)輸入十進(jìn)制整數(shù):"<<endl; 34 cin>>num; 35 cout<<f(num)<<endl; 36 return 0; 37 }三.結(jié)果截圖
轉(zhuǎn)載于:https://www.cnblogs.com/yue3475975/p/4587558.html
總結(jié)
- 上一篇: Python3.4连接Mysql
- 下一篇: 生成Geometry