【UVa】[1225]Digit Counting

文章字数:544

问题描述

问题分析

/*用字符的形式保存整数

然后再判断就好了*/

刚开始想的是上面这种给一串数让找

结果发现是找 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

加载中...