十进制中正整数N中1的个数(2)
上面的那種各個數據進行遍歷的方法,耗時,
我們可以通過根據數的規律進行觀察是否存在某種規律:
當N是1位數的情況:
? ? ? ? 如果N=3,那么從1到3的所有數字總,1,2,3,只有你個位數字的出現的個數是1,
? ? ? ?當N=9時,出現1的個數也是1個。
當N是兩位數的時候:
? ? ? ?當是兩位數的時候,個位和十位上都可能出現1,我們分開考慮,
? ? ? ?當N=33時,所有數中個位出現1的個數是4,在十位上出現1的個數是10,總數是14
? ? ?當N=55式,個位數上出現1的個數是6,十位上出現1的個數是10,總數是16
?
? ? ?sum(19)=個位出現的個數+十位出現的個數=2+10=12
? ? ?sum(29)=個位出現的個數+十位出現的個數=3+10=13
? ? ?sum(39)=個位出現的個數+十位出現的個數=4+10=14
? 。。。。。。。。。。。。。。
? ???sum(99)=個位出現的個數+十位出現的個數=10+10=20
當N是三位數的時候:
分別統計百位、十位‘個位上1的個數
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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的个数
- 下一篇: 第一章语言基础