本着 “代码即注释,注释即文档” 的写作思路,本文将尽量把代码和注释都写得简洁易懂。
这是《程序设计思维与实践》课程第一周试验的IO部分。这部分包含了算法题目中输入输出的大部分情况,掌握这些也就基本掌握了输入输出的思路。另外关于stdio与iostream效率与简便性之争,我之前也在纠结,但一番实验做下来,我觉得stdio就是神器,还要啥自行车啊:-)。
A - IO1
计算a+b
Input
输入第一行是一个整数N,代表接下来N行会有N组样例输入。
Output
每组输出占一行。
Sample Input
2
1 5
10 20
Sample Output
6
30
#include<cstdio>
int main() {
//freopen ( "input.txt", "r", stdin );
int n;
scanf("%d",&n);
for(int i=0; i<n; i++) {
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",a+b);
}
return 0;
}
B - IO2
计算a+b
Input
有多组样例输入,以0 0代表输入结束。
Output
每组输出占一行
Sample Input
1 5
10 20
0 0
Sample Output
6
30
#include<cstdio>
int main() {
//freopen("input.txt","r",stdin);
int a,b;
//获取到输入结束,同时判断输入的ab是不是同为0
//这里的简洁写法很值得学习
while(~scanf("%d %d",&a,&b)&&(a||b)) {
printf("%d\n",a+b);
}
return 0;
}
C - IO3
计算a+b
Input
有多组样例输入
Output
每组输出占一行
Sample Input
1 5
10 20
Sample Output
6
30
#include<cstdio>
int main() {
int a,b;
//小白可能傻眼,因为这道题的输入没有明显的结束标志
//但其实这里只是需要一个小trick
//scanf在遇到输入结束(EOF)时会返回-1
//cin遇到结束返回0
//EOF代表文件结束End Of File(其实就是二进制全为0的 char )
//文本文档末尾自动包含EOF,控制台使用ctrl+z可输入EOF
//我管这个叫“无穷行”技巧
//相应的还有一行中有不定个输入的“无穷列”技巧
while(~scanf("%d %d",&a,&b)){
printf("%d\n",a+b);
}
return 0;
}
D - IO4
你的任务是计算一些整数的和
Input
输入包含多组样例。
每组样例包含一个整数N,然后在同行有N个整数。
若N = 0,则表示输入结束,这个样例不需要被处理。
Output
对于每组用例,你应当输出这组样例N个数字的和,每个输出占一行。
Sample Input
4 1 2 3 4
5 1 2 3 4 5
0
Sample Output
10
15
#include<cstdio>
int main() {
int N;//尽量使用题目中的符号命名变量,这样不至于混淆命名
int n;
int sum;
//外循环用于获取行首以及判断结束
while(scanf("%d",&N) && N) {
sum = 0;
//内循环用于获取每一行剩下的数字
while (N--) {
scanf("%d",&n);
sum += n;
}
printf("%d\n",sum);
}
}
E - IO5
请计算下面每行数的和。
Input
第一行有一个整数N,表示有N行数。接下来N行,每行第一个为整数M,表示本行后面有M个整数。
Output
对于输入的每一行数,请分别对应输出每一行数的和。
Sample Input
2
4 1 2 3 4
5 1 2 3 4 5
Sample Output
10
15
Hint
本题相关知识:输入输出和循环语句(for)的使用方式。
//本题无特殊技巧
#include<cstdio>
int main() {
int m;
int N;
int n;
int sum;
scanf("%d",&m);
for(int i=0; i<m; i++) {
scanf("%d",&N);
sum = 0;
while (N--) {
scanf("%d",&n);
sum += n;
}
printf("%d\n",sum);
}
return 0;
}
F - IO6
请计算下面每行数的和。
Input
输入包含多组数据,每组数据占一行。每行第一个数为整数N,后面有N个整数
Output
对于输入的每一行数,请分别对应输出每一行数的和。
Sample Input
4 1 2 3 4
5 1 2 3 4 5
Sample Output
10
15
Hint
本题相关知识:输入输出和循环语句(while)的使用方式。
#include<cstdio>
int main() {
int N;
int n;
int sum;
//以一样的无穷行技巧
while(~scanf("%d",&N)) {
sum = 0;
while (N--) {
scanf("%d",&n);
sum += n;
}
printf("%d\n",sum);
}
}
G - IO7 PE
你的任务是求许多数的和。
Input
第一行需要输入一个整数N,接下来会有N行。 每一行开始输入一个整数M,然后会有M个数在同一行。
Output
对于每组输入,要求在一行输出它们的和。并且你要保证每组输出之间有一空行。
Sample Input
3
4 1 2 3 4
5 1 2 3 4 5
3 1 2 3
Sample Output
10
15
6
//这道题的输出有个神坑,最后必须有个回车
#include<cstdio>
int main() {
int m;
int N;
int n;
int sum;
scanf("%d",&m);
for(int i=0; i<m; i++) {
scanf("%d",&N);
sum = 0;
while (N--) {
scanf("%d",&n);
sum += n;
}
if(i==0)printf("%d\n",sum);
else printf("\n%d\n",sum);
}
return 0;
}
H - 长长记性
你的任务还是计算a + b.
Input
题目包含多组数据,每组数据一行. 每行两个整数 a 和 b ( 1 <= a, b ) , 用一个空格分开,某行 a = 0, b = 0, 意味着数据EOF.
Output
输出结果
Sample Input
1 5
10 20
100 10
0 0
Sample Output
6
30
110
#include<cstdio>
int main() {
//freopen("input.txt","r",stdin);
int a,b;
//输入加判断0
while(~scanf("%d %d",&a,&b)&&(a||b)) {
printf("%d\n",a+b);
}
return 0;
}