有同学随手出了道「超级简单」的题,我当年还是写磕绊了——说明 输入格式 比公式更容易害人。记录如下。
题目
- 给定等长数组 (a[n], b[n])
- (c[i] = a[i]\times 2 - b[i])
- 输入两行:每行先是正整数 (n),再跟 (n) 个数
- 输出一行:先
n,再n个 (c[i])(空格分隔)
样例:
输入:
10 18 38 83 93 53 36 39 58 8 93
10 55 79 20 71 60 66 79 55 78 66
输出:
10 -19 -3 146 115 46 6 -1 61 -62 120
易错点
- 第一个数是长度,不是
a[0] - 两行的 (n) 应一致,生产代码应校验
- 循环边界:
for (i=0;i<n;i++),不要写成i<=n导致多输出 - 结果可能为负,注意类型用
int足够本题
参考代码
#include <iostream>
using namespace std;
int main() {
int n1, n2;
if (!(cin >> n1)) return 0;
int a[100], b[100];
for (int i = 0; i < n1; ++i) cin >> a[i];
cin >> n2;
for (int i = 0; i < n2; ++i) cin >> b[i];
int n = n1;
if (n1 != n2) {
// 题目保证相同;防御式取最小
n = n1 < n2 ? n1 : n2;
}
cout << n;
for (int i = 0; i < n; ++i) {
cout << ' ' << (a[i] * 2 - b[i]);
}
cout << '\n';
return 0;
}
教训
OJ 入门期,I/O 格式熟练度 和算法同等重要。公式一眼能看懂,却在 cin 顺序上栽跟头,非常正常。把它当「输入输出健身」即可。
小结
读题 → 画一版输入解析 → 再写变换。这题本身没有算法含量,但很适合当作「是否细心」的热身。
再测一组
输入:
3 1 2 3
3 3 2 1
输出:
3 -1 2 5
验算:1*2-3=-1,2*2-2=2,3*2-1=5。
调试建议
- 先只打印读入的
a[]、b[],确认没有把长度当成数据 - 用重定向测:
./a.out < input.txt - 注意行末空格:部分 OJ 对行尾空格敏感,可先拼字符串再输出
输入输出熟练后,再刷算法题会少很多「明明会做却 WA」的情况。