有同学随手出了道「超级简单」的题,我当年还是写磕绊了——说明 输入格式 比公式更容易害人。记录如下。

题目

样例:

输入:
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

易错点

  1. 第一个数是长度,不是 a[0]
  2. 两行的 (n) 应一致,生产代码应校验
  3. 循环边界:for (i=0;i<n;i++),不要写成 i<=n 导致多输出
  4. 结果可能为负,注意类型用 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=-12*2-2=23*2-1=5

调试建议

输入输出熟练后,再刷算法题会少很多「明明会做却 WA」的情况。