任意非負整數,求1 n之間含有1的整數的個數

2021-07-26 05:24:43 字數 1254 閱讀 6311

題目描述:求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。

解析:1、將整數劃分成2部分,以個位、十位、百位.....分別為分界線,以32459為例,以百位為分界位為例,可分為324和59兩部分

int a = n/i,b = n%i;  i = 100; //a為前一部分,b為後一部分

2、當分界位為0時,32059 左部分有(0~31)32種可能時,右邊有10*10種可能,共有32*10*10種選擇,

因為百位為1時,小於32059的數左邊只能取(0~31),當左邊為32時,右邊部分不管取什麼,百位都不能為1

if(a%10 == 0)

3、當分界位為1時,32159 左部分有(0~31)32種可能時,右邊有10*10種可能,共有32*10*10種選擇

左邊為32時,右邊部分有(0~59)60種選擇

if(a%10 == 1)

4、當分界位大於1時,32259百位可以取到1,左部分有(0~32)33種可能時,右邊有10*10種可能,共有33*10*10種選擇

為什麼這個是33,以上兩者是32,因為不管左部分取(0~31)還是32時,右邊都有10*10種可能。

if(a%10 >= 2)   

這三個條件語句可以融合成一條語句即:

**為:

int numberof1between1andn_solution(int n)

return sumvalue;

}

為什麼是(a+8)/10,這一句是以上三種條件下的融合,

根據以上三式可知,當分界位為0和1時,0和1加8除以10還是0,2~9加8除以10為1,(a/10 + 1)的效果,左邊多一種可能。

還有一種方法,就是從1到n每個數都進行判斷是否含有1,它的時間複雜度為o(n*logn),上種方法時間複雜度為o(logn),當n特別大時,快慢可想而知,但是這個方法容易想到,上乙個方法難以想到。

int numberof1between1andn_solution(int n)

return sumvalue;

}int numberof1(int num)

num = num/10;

}return sum;

}

計算1 n之間1的個數

求出113的整數中1出現的次數,並算出1001300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數 從1 到 n 中1出現...

求1 n中1的個數

輸入乙個整數,求1 n這n個數的十進位制表示1的個數。將n的十進位制的每一位單獨拿出討論,每一位的值記為weight。1 個位 假若n 534。534的個位從0 9變化了53次,這53我們記為round。因為weight為4 0。因此第54輪為0 4,因此1出現了count round 1。若wei...

求1 n整數中1出現的次數

自己不會,看看大神的解法,自己總結一下下,有更好的思路,望指教!解題思路 將數字進行拆分,分為三部分,高位,低位,和當前位 以求十位出現1的次數為例,digit 10 1.以n 1202為例,此時,高位high 12,低位low 2,當前位cur 0 此時十位出現1 的數字的範圍是 0010 111...