在从1到n的正数中1出现的次数
題目:輸入一個(gè)整數(shù) n ,求從 1 到 n 這 n 個(gè)整數(shù)的十進(jìn)制表示中 1 出現(xiàn)的次數(shù)。例如輸入 12 ,從 1 到 12 這些整數(shù)中包含 1 的數(shù)字有 1 , 10 , 11 和 12 ,1 一共出現(xiàn)了5 次。
分析:
???????? 我們?cè)龅竭^(guò)求給定數(shù)num的二進(jìn)制表示中1出現(xiàn)的次數(shù),但此題是求十進(jìn)制數(shù)中1出現(xiàn)的次數(shù)。簡(jiǎn)單的來(lái)想,可以用除法、取余來(lái)求的一個(gè)數(shù)中1的個(gè)數(shù),然后再?gòu)?到n循環(huán)即可解決。但當(dāng)n比較大時(shí),速度會(huì)比較慢。我們現(xiàn)在來(lái)嘗試從另一種思路來(lái)尋求一種更高效的方法。
??????? 我們可以換一種思路,分別求每位出現(xiàn)1的次數(shù),然后再將每位出現(xiàn)1的次數(shù)相加即是所求。 不妨假設(shè)要求的數(shù)是abcde(a>0),一般地,我們求第3位,也就是百位數(shù)字出現(xiàn)1的次數(shù),可分為如下三種情況:
????????? (1),當(dāng)c=0 時(shí),則該位出現(xiàn)1的數(shù)分析如下:
????????? 00100--00199
????????? 01100--01199
????????? 02100--02199
????????? ……
???????? 0b100--0b199
???????? 上面一共是b*100,對(duì)于a,我們進(jìn)行類似的分析,從0b200到0(b+1)099的數(shù)字中,百位數(shù)字是不會(huì)出現(xiàn)1的:
???????? 0(b+1)100--0(b+1)199
???????? 0(b+2)100--0(b+2)199
???????? ……
???????? 0(b+9)100--0(b+9)199
???????? 0(b+10)100--0(b+10)199即1b199
?????? 從0b200到1b199,共有10*(b*100)個(gè)百位數(shù)字為1的數(shù)字。那么類似的可以知道,從1b200到2b199同樣有10*b*100個(gè)百位數(shù)字為1的數(shù)字。依次類推,從2b200到3b199,……,(a-2)b200到(a-1)b199,由于c=0,因此百位出現(xiàn)1的最大的數(shù)字應(yīng)該為a(b-1)199;那么一共有多少個(gè)這樣的數(shù)據(jù)段呢?應(yīng)該比較容易看出來(lái),一共有a個(gè)。由此可以看出當(dāng)c=0時(shí),低位數(shù)字是不影響本位數(shù)字為1的數(shù)字的個(gè)數(shù)的。
由以上分析可知,百位數(shù)字為1的數(shù)字共有a*10*100+b*100=ab*100個(gè);
??????? (2),當(dāng)c=1時(shí),則該位出現(xiàn)1的數(shù)分析如下:
???????? 在(1)情況分析的基礎(chǔ)上,因?yàn)閏=1,所以從a(b-1)200到ab1de中,仍有百位數(shù)字為1的數(shù)字存在,且比較容易知道一共有de+1個(gè):即從ab100一直到ab1de,由此可以發(fā)現(xiàn),此時(shí)低位數(shù)字影響了本位數(shù)字為1的數(shù)字的個(gè)數(shù)。
??????? 所以,此種情況,百位數(shù)字為1的數(shù)字共有:ab*100+de+1
??????? (3),當(dāng)c>1時(shí),則該位出現(xiàn)1的數(shù)分析如下:
???????? 仍然在(1)分析的基礎(chǔ)上,因?yàn)閏>1,所以從a(b-1)200到ab199(因?yàn)閏>1,所以abcde>ab199,而ab200到abcde中百位數(shù)字是不會(huì)出現(xiàn)1的)中,仍有1*100個(gè)百位數(shù)字為1的數(shù)字,在此情況下,我們同樣可以發(fā)現(xiàn),此時(shí)低位數(shù)字又不影響本位數(shù)字為1的數(shù)字的個(gè)數(shù)了。
??????? 所以,此種情況,百位數(shù)字為1的數(shù)字共有:ab*100+1*100=(ab+1)*100.
分析到這里,我想就應(yīng)該比較容易寫出程序了吧^_^
轉(zhuǎn)載于:https://blog.51cto.com/10622551/1694395
總結(jié)
以上是生活随笔為你收集整理的在从1到n的正数中1出现的次数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 详解MySQL中EXPLAIN解释命令
- 下一篇: 自己实现简单的AOP(三) 实现增强四项