top1编程
← 返回题目
题解

N个整数

1 条题解

  • 0
    @ 2026-8-6 2:18:11

    P4857 N个整数(入门)

    解题思路

    第一步,理解题意。 大熊的程序要持续输入整数,直到输入 0 时停止。输入结束后,要把这串数字从头到尾输出一遍,再倒过来从尾到头输出一遍。注意 0 是停止信号,它本身不输出。

    第二步,为什么必须存起来。 因为要先正序输出、再倒序输出,总共要用两遍数据。如果只读一遍存起来,后面就能反复使用;所以开一个数组 a 把所有数字存下来,cnt 记录个数。

    第三步,读取存储。 用一个死循环读整数 x:如果 x 等于 0,就用 break 跳出循环停止输入;否则把 x 存进 a[cnt],cnt 加 1。

    第四步,正序输出。 用循环从 i=0 到 i=cnt-1,依次输出 a[i]。数字之间用空格分隔,用"第一个数字前面不加空格,其余数字前面加一个空格"的方式来控制格式。

    第五步,倒序输出。 再从 i=cnt-1 一路倒回到 i=0,依次输出 a[i]。注意这时的空格控制:最后一个输出的数(也就是原数组第一个数 a[0])前面不加空格,其他数前面加空格。两行输出之间换行。

    第六步,边界情况。 每个整数都小于 2 的 31 次方,用 int 类型就能存下;如果第一个输入就是 0,那么 cnt=0,两行都只输出一个空行(也就是没有任何数字)。举个例子:输入 1 3 3 1 4 6 2 0,正序是 1 3 3 1 4 6 2,倒序是 2 6 4 1 3 3 1,和样例一致。

    参考代码

    // N个整数:输入到0停止,正序和倒序各输出一遍
    #include <iostream>
    using namespace std;
    int main() {
        int a[100005];    // 存输入的数字
        int cnt = 0;
        int x;
        while (true) {
            cin >> x;
            if (x == 0) break;   // 遇到0停止输入
            a[cnt++] = x;
        }
        for (int i = 0; i < cnt; i++) {  // 正序输出
            if (i) cout << ' ';
            cout << a[i];
        }
        cout << endl;
        for (int i = cnt - 1; i >= 0; i--) {  // 倒序输出
            if (i != cnt - 1) cout << ' ';
            cout << a[i];
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    时间复杂度:读入是 O(cnt),正序输出是 O(cnt),倒序输出是 O(cnt),总时间是 O(cnt),其中 cnt 是数字个数。

    空间复杂度:需要一个数组存所有数字,是 O(cnt)。

    • 1