日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

找1的个数

發布時間:2024/8/24 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 找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的總數??梢詮腘這個數總結出來的。

? ? ? 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

總結

以上是生活随笔為你收集整理的找1的个数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。