十进制中正整数N中1的个数(2)
上面的那種各個數(shù)據(jù)進行遍歷的方法,耗時,
我們可以通過根據(jù)數(shù)的規(guī)律進行觀察是否存在某種規(guī)律:
當N是1位數(shù)的情況:
? ? ? ? 如果N=3,那么從1到3的所有數(shù)字總,1,2,3,只有你個位數(shù)字的出現(xiàn)的個數(shù)是1,
? ? ? ?當N=9時,出現(xiàn)1的個數(shù)也是1個。
當N是兩位數(shù)的時候:
? ? ? ?當是兩位數(shù)的時候,個位和十位上都可能出現(xiàn)1,我們分開考慮,
? ? ? ?當N=33時,所有數(shù)中個位出現(xiàn)1的個數(shù)是4,在十位上出現(xiàn)1的個數(shù)是10,總數(shù)是14
? ? ?當N=55式,個位數(shù)上出現(xiàn)1的個數(shù)是6,十位上出現(xiàn)1的個數(shù)是10,總數(shù)是16
?
? ? ?sum(19)=個位出現(xiàn)的個數(shù)+十位出現(xiàn)的個數(shù)=2+10=12
? ? ?sum(29)=個位出現(xiàn)的個數(shù)+十位出現(xiàn)的個數(shù)=3+10=13
? ? ?sum(39)=個位出現(xiàn)的個數(shù)+十位出現(xiàn)的個數(shù)=4+10=14
? 。。。。。。。。。。。。。。
? ???sum(99)=個位出現(xiàn)的個數(shù)+十位出現(xiàn)的個數(shù)=10+10=20
當N是三位數(shù)的時候:
分別統(tǒng)計百位、十位‘個位上1的個數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?9以下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1個
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 99以下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1*10+10*1=20個
? ? ? ? ? ? ? ? ? ? ? ? ? ?999以下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?100*1+10*20=300個
? ? ? ? ? ? ? ? ? ? ? 9999以下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1*1000+10*30=4000個
? ? ? ? ? ? ? ?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
? ? ? ? ? ? 9999999999以下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?9000000個
? ? ? ?999999999999以下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?100000000個
當n增加10,至少增加1個1
當n增加100,至少增加20個1
當n增加1000,至少增加300個1
當n增加10^k,時,至少增加k*10^k-1個1
代碼:
int coutinter(int n) {int count = 0;int ifactor = 1;int islower = 0;int icurrnum = 0;int ihigh = 0;while (n / ifactor != 0){islower = n - (n / ifactor)*ifactor;icurrnum = (n / ifactor) % 10;ihigh = n / (ifactor * 10);switch (icurrnum){case 0:count += ihigh*ifactor;break;case 1:count += ihigh*ifactor + islower + 1;break;default:count += (ihigh + 1)*ifactor;break;}ifactor *= 10;} }
總結
以上是生活随笔為你收集整理的十进制中正整数N中1的个数(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十进制中正整数N中1的个数
- 下一篇: 第一章语言基础