n個整數中1出現的次數

2022-05-30 11:15:08 字數 1338 閱讀 4047

整數中1出現的次數(從1到n整數中1出現的次數) (兩種方法:1、規律。2暴力求解)

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

如果第 i 位(自右向左,從1開始標號)上的數字是0,則第 i 位可能出現 1 的次數由更高位決定(若沒有高位,則視高位為0),等於更高位數乘以當前位數的權重(10i-1)

如果第 i 位上的數字為 1,則第 i 位上出現 1 的次數不僅受更高位影響,還受低位影響(若沒有低位,視低位為0),等於更高位數乘以當前位數的權重 (10i-1) + (低位數 + 1)

如果第 i 位上的數字大於 1,則第 i 位上可能出現 1 的次數僅由更高位決定(若沒有高位,視高位為0),等於(更高位數 + 1)乘以當前位數的權重 (10i-1)

這裡的 x 屬於[1, 9], 因為 x = 0 不符合下列規律,需要單獨計算

首先要知道以下規律

接下以 n = 2593, x = 5 為例來解釋如何得到數學公式。從 1 至 2593中,數字 5 總計出現了 813 次,其中有 259次出現在個位,260次出現在十位,294次出現在百位,0次出現在千位

到此為止,已經計算出全部數字 5 的出現次數。

總結一下以上的演算法,可以看到,當計算右數第 i 位包含的 x 的個數時:

#include using

namespace

std;

int onenum(int

n)

else

if(cur==1

)

else

base*=10

; cur=high%10

; high=n/(base*10

); low=n%base

; }

return

count;

}int

main()

return0;

}

由分析思路或者**都可以看出,while迴圈的次數就是n的位數,logn(以10為底),而迴圈體內執行的操作都是有限次的,所以時間複雜度為o(logn)。

暴力求解:

方法:對1到n中的每乙個數,分別判斷其中1的個數。

複雜度:o(n*logn)

int onenum_b(int

n) }

return

count;

}

整數中1出現的次數(從1到n整數中1出現的次數)

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

整數中1出現的次數(從1到n整數中1出現的次數)

時間限制 1秒 空間限制 32768k 題目描述 include using namespace std class solution 求之前的length 1位中含乙個數 int base1 0 int base2 1 for int i 0 i1 i cout cout cout 求從base2...

整數中1出現的次數(從1到n整數中1出現的次數)

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