acwing 338. 計數問題
給定兩個整數 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』出現的次數,以此類推。
資料範圍
0110
44497
346542
1199
1748
1496
1403
1004
5031714
1901317
8541976
4941001
1960
00輸出樣例:
121
1111
11185
185185
185190
9696
9695
9340
4040
93136
8240
4040
40115
666215
215214
205205
154105
10616
11319
20114
2020
1919
16107
105100
101101
197200
200200
200413
1133
503503
503502
502417
402412
196512
186104
8793
9797
142196
3981375
398398
405499
499495
488471
2941256
296296
296296
287286
286247
列舉情況:
//假設n
=abcdefg//
求每一位是t的情況是多少//
當t==
0時,不能有前導全
0//d不能在a的位置
//當d==
t時:(001
~abc-1)
0*10^
(efg)+
abc0
(000
~efg)/
/當d>t時:
(001
~abc)t
*10(efg)/
/當d<
t時,不存在//
當t!=
0時,可以有前導全
0//當d=
=t時:(
000~
abc-1)
t*10^
(efg)+
abct
(000
~efg)/
/當d>t時:
(000
~abc)t
*10^(
efg)//
當d(000
~abc-1)
t*10^
(efg
)
#include
#include
#include
using
namespace std;
const
int n =10;
/*001~abc-1, 999
abc 1. num[i] < x, 0
2. num[i] == x, 0~efg
3. num[i] > x, 0~999
*/int
get(vector<
int> num,
int l,
int r)
//算出陣列num第r位到第l位的數是多少
intpower10
(int x)
//求10的i次方
intcount
(int n,
int x)
//1~n中數字k出現的次數
n = num.
size()
;int res =0;
for(
int i = n -1-
!x; i >=
0; i --)if
(num[i]
== x) res +
=get
(num, i -1,
0)+1
;else
if(num[i]
> x) res +
=power10
(i);
}return res;
}int
main()
return0;
}
計數問題(數字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 字尾有幾位就是十的幾次...
AcWing 338 計數問題(數字統計dp)
acwing 338.計數問題 給定兩個整數 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 出現1...