问题描述
问题分析
/*用字符的形式保存整数
然后再判断就好了*/
刚开始想的是上面这种给一串数让找
结果发现是找 1~N 的所有数字出现的次数……
于是被坑了 -.-
所以就要考虑是否超时的问题……
然后还是感觉直接打表好了
毕竟这个问题如果超时的话应该就是重复了很多已经算过的运算
/*(而且给出的示例输出最后一个数字后有个空格~ xi xi xi)*/
好坑的题目啊 上面那括号里的一句不对
虽然题目示例输出有空格 但结果还是要求不带空格的-.-
如果最后有空格 会PE…… -.-
AC代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include<stdio.h>
int a[10010][10];
int main() {
int n,t;
// int a[10010][10]; 放到这里在数据大的时候会WA
for(int i=1; i<10010; i++) {
for(int j=i; j; j/=10) {
for(int k=i; k<10010; k++)
a[k][j%10]++;
}
}
scanf("%d",&n);
while(n--) {
scanf("%d",&t);
for(int i=0; i<9; i++)
printf("%d ",a[t][i]);
printf("%d\n",a[t][9]);
}
return 0;
}
|
注意数组需要放在 int main 外面……
-.- 应该是所谓溢出的问题吧
再附一个根据别人写的来写的打表法
这个打表的时候的第三个循环用的不一样
(也就是记录上次数据的方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include<stdio.h>
int a[10010][10];
int main() {
int n,t;
for(int i=1; i<10010; i++) {
for(int j=i; j; j/=10) {
a[i][j%10]++;
}
for(int j=0; j<10; j++)
a[i][j]+=a[i-1][j];
}
scanf("%d",&n);
while(n--) {
scanf("%d",&t);
for(int i=0; i<9; i++)
printf("%d ",a[t][i]);
printf("%d\n",a[t][9]);
}
return 0;
}
|
PS:
写AC代码的时候还意外写出了第一种理解的代码-.-
好吧~也留作纪念好了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| #include<stdio.h>
int main() {
int n,t;
int a[10010][10];
for(int i=1; i<10010; i++) {
for(int j=i; j; j/=10) {
a[i][j%10]++;
}
}
scanf("%d",&n);
while(n--) {
scanf("%d",&t);
for(int i=0; i<10; i++)
printf("%d ",a[t][i]);
printf("\n");
}
return 0;
}
|
题目地址:【UVa】[1225]Digit Counting