ACM初窥门径(一)
最近已经开始做了一些简单的杭电ACM题目作为入门,当然这些问题所涉及到的解题思路是非常简单的,算法也没有什么特别大的难度,主要的问题还是在于输入和输出的格式上的问题,然后对于某些方面的输入输出的刻板要求,感觉有点像高中的模式,就是有些过于注重解决的格式,而并不承认解决问题的多样方法。而且也是和高中的模式一样,有好多的题型,根据这些题型去解决问题,然后需要反复的练习,可能我的感觉也有点片面吧。虽然有点弊端,但是好处还是很多的,确实是一个掌握算法不错的途径。所以要好好加油。
废话不多说,直接上题:
1.ACM steps 1.1.8:
解题代码如下:
#include <stdio.h>
int main(void) {
int N, M, sum, a;
scanf("%d", &N);
while(N--) {
sum = 0;
scanf("%d", &M);
while(M--) {
scanf("%d", &a);
sum += a;
}
if(0 != N) {
printf("%d\n\n", sum);
} else {
printf("%d\n", sum);
}
}
return 0;
}
这个题目的一个特殊格式在于,最后一个输出只有换一行,而不是换两行,有一点点狗血,但是自己还是思考了半天没有想到,在以前看来是一种奇怪的格式,以后一定要缜密的去思考题目要求,不过要吐槽以下的是,1.1.7中也是同样的输出示例,只不过是输出两个数的和,但是我按照每个输出后都有两个换行的格式去输出,最后却没有格式错误。
2.ACM2007
解题代码如下:
#include <stdio.h>
int main(void) {
int m, n, x, y, t;
while(scanf("%d%d", &m, &n) != EOF) {
x = y = 0;
if(m > n) {
t = m;
m = n;
n = t;
}
while(m <= n) {
if(m % 2 == 0) {
x += m * m;
} else {
y += m * m * m;
}
++m;
}
printf("%d %d\n", x, y);
}
return 0;
}
这次在输入上又翻了一次车,总是按照示例的思路去思考这个输入,殊不知示例已经悄悄的给你挖好了坑等着你跳,他从来没有说明 m n 之间到底是一种什么关系,既然没有说,也就代表着,他们两个谁大谁小是不确定的,两种情况也都是要考虑的,所以在一开始没有7-11行的代码,一直是错误,直到加上了这一段....输入上的坑也长了见识。
3.ACM2010
解题代码如下:
#include <stdio.h>
int main(void) {
int m, n, sum, t, a, b;
int c[5];
while(scanf("%d%d", &m, &n) != EOF) {
t = 0;
while(m <= n) {
a = m;
sum = 0;
while(a != 0) {
b = a % 10;
a /= 10;
sum += b * b * b;
}
if(sum == m) {
c[t] = sum;
++t;
}
++m;
}
if(t == 0) {
printf("no\n");
} else {
for(int i = 0; i < t - 1; ++i) {
printf("%d ", c[i]);
c[i] = 0;
}
printf("%d\n", c[t - 1]);
c[t] = 0;
}
}
return 0;
}
这道题依稀记得当时上C语言课的时候还在上机课上做过,不过忘记当时怎么写的了,但是感觉解题的思路也不是很难,所以第一个想到的思路并不是上边解题的方法,而是直接在判断是否是水仙花数之后直接对数字进行输出,对也就是这样:
printf("%d ", sum);
对后边会有一个空格,那最后一个水仙花数怎么处理多出来的空格呢,当然我也想到了,因为这样输出的话必定要有一个标志变量来看是否在这个区间内有水仙花数,那么结束循环之后,如果标志变量表示没有水仙花数就输出no,如果有的话就输出一个/b,也就是循环结束后的代码是:
if(!have) {
printf("no\n");
} else {
printf("\b");
}
如此就可以顺利解决输出多一个空格的问题了,但是很遗憾,系统并没有认为我是对的,可能系统对于这种字符,还是认为他输出的是一串ASCII值而不是我们看到的机器输出的效果,所以在判断的时候也就自然认为我是错的,所以对于这种特殊字符上的使用,也需要谨慎。
好了,每一篇整理不超过三个吧,要不然显得特别乱,而且也不好看。