## 题目背景
Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。
## 题目描述
Bessie 的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码($0 \ldots 9$):每一个数码在计数的过程中出现过多少次?
给出两个整数 $M$ 和 $N$,求在序列 $[M, M + 1, M + 2, \ldots, N - 1, N]$ 中每一个数码出现了多少次。
## 输入格式
第 $1$ 行: 两个用空格分开的整数 $M$ 和 $N$。
## 输出格式
第 $1$ 行: 十个用空格分开的整数,分别表示数码 $0 \ldots 9$ 在序列中出现的次数。
## 样例 #1
### 样例输入 #1
```
129 137
```
### 样例输出 #1
```
1 10 2 9 1 1 1 1 0 1
```
## 提示
数据保证,$1 \leq M \leq N \leq 2 \times 10^9$,$N-M \leq 5 \times 10^5$。
##思路
最开始我想的是通过字符串方式把他合并之后在进行统计,但测试发现这样很容易超时,像下面这种
s=''
M,N=map(int,input().split())
for i in range(M,N+1):
s+=str(i)
for i in range(0,10):
print(s.count(str(i)),end=' ')
后面我发现,这种题的本质就是对数位的统计,和取位是一样的,可以使用取余数的方法来统计,不过这样就得开辟新的空间,
l=[0]*10
M,N=map(int,input().split())
for i in range(M,N+1): #for控制数据输入
num=i
while num>0: # 对取到的数操作
b=num%10 # 取得个位
num=num//10 # 去掉个位
l[b]+=1 # 添加进数组
for i in l:
print(i,end=' ')
这里开辟了一个列表来保存数据,数组长度会随着数据变大而改变,所以空间复杂度是O(n) 时间复杂度是O(n^2)
下面是c语言代码
#include<stdio.h>
int main() {
int i, n1, n2, b;
int a[10] = {0};
scanf("%d %d", &n1, &n2);
for (i = n1; i <= n2; i++) {
int num = i;
while (num > 0) {
b = num % 10;
num = num / 10;
a[b]++;
}
}
for (i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
return 0;
}