演算法題 數字dp 計數問題(Python

2021-10-16 09:16:48 字數 1840 閱讀 1253

給定兩個整數 a 和 b,求 a 和 b 之間的所有數字中0~9的出現次數。

例如,a=1024,b=1032,則 a 和 b 之間共有9個數如下:

1024 1025 1026 1027 1028 1029 1030 1031 1032

其中『0』出現10次,『1』出現10次,『2』出現7次,『3』出現3次等等…

輸入格式

輸入包含多組測試資料。

每組測試資料佔一行,包含兩個整數 a 和 b。

當讀入一行為0 0時,表示輸入終止,且該行不作處理。

輸出格式

每組資料輸出乙個結果,每個結果佔一行。

每個結果包含十個用空格隔開的數字,第乙個數字表示『0』出現的次數,第二個數字表示『1』出現的次數,以此類推。

資料範圍

0輸入樣例:

1 10

44 497

346 542

1199 1748

1496 1403

1004 503

1714 190

1317 854

1976 494

1001 1960

0 0

輸出樣例:

1 2 1 1 1 1 1 1 1 1

85 185 185 185 190 96 96 96 95 93

40 40 40 93 136 82 40 40 40 40

115 666 215 215 214 205 205 154 105 106

16 113 19 20 114 20 20 19 19 16

107 105 100 101 101 197 200 200 200 200

413 1133 503 503 503 502 502 417 402 412

196 512 186 104 87 93 97 97 142 196

398 1375 398 398 405 499 499 495 488 471

294 1256 296 296 296 296 287 286 286 247

def count(n, target):

cnt = 0

high = n // 10

low = 0

tmp = n

i = 0

while tmp:

cur = tmp % 10

tmp //= 10

if target == 0 and tmp == 0: break # 最高位無法為0,直接跳出

# 高位

if target == 0: cnt += (high - 1) * 10 ** i

else: cnt += high * 10**i

# 低位

if cur > target: cnt += 10 ** i

elif cur == target: cnt += low + 1

i += 1

low = n % (10 ** i)

high = n // (10 ** (i+1))

return cnt

while true:

a, b = map(int, input().split())

if a > b: a, b = b, a

if a == 0 and b == 0: break

for i in range(10):

if i == 9: print(count(b, i) - count(a - 1, i))

else: print(count(b, i) - count(a - 1, i), end=' ')

數字dp 計數問題 模板題 數字dp

數字dp目前見的比較少,最為經典的莫過於不要62,或許以前都是暴力求解。例如求解1 n中,數字x出現的次數這類題,暴力列舉每個數的時間複雜度為 o n o n o n 再列舉每一位的時間複雜度為 log 10nlog n log10n 數字一大妥妥超時。值得一提的是,2020 的藍橋杯,第一道簽到題...

計數問題(數字dp)

給定兩個整數 a 和 b,求 a 和 b 之間的所有數字中0 9的出現次數。例如,a 1024,b 1032,則 a 和 b 之間共有9個數如下 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出現10次,1 出現10次,2 出現7次,3 出現3次...

數字DP 計數問題

題目鏈結 第一次做真的很難,總之十分耗費時間。include include include using namespace std const int n 10 get前面字首部分的數值,即前面字首總方案數 intget vector int num,int l,int r 字尾有幾位就是十的幾次...