题解:洛谷 P1427 小鱼的数字游戏

【题目来源】

洛谷:P1427 小鱼的数字游戏 - 洛谷

【题目描述】

小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 \(a_i\)(长度不一定,以 \(0\) 结束),记住了然后反着念出来(表示结束的数字 \(0\) 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。

【输入】

一行内输入一串整数,以 \(0\) 结束,以空格间隔。

【输出】

一行内倒着输出这一串整数,以空格间隔。

【输入样例】

3 65 23 5 34 1 30 0

【输出样例】

30 1 34 5 23 65 3

【核心思想】

  1. 问题分析:输入一串以 0 结尾的整数序列,要求倒序输出除结尾 0 以外的所有整数。本质是一个序列存储与反向遍历问题,无需对数据进行任何修改或计算。

  2. 算法选择

    • 数组存储 + 倒序输出:使用数组按输入顺序存储所有非零整数,记录存储长度,然后从最后一个元素向前遍历输出。这种方法简单直接,时间复杂度 \(O(n)\),空间复杂度 \(O(n)\),适合任意长度的输入序列。
    • 递归(可选):也可使用递归函数读入数字,遇到 0 则返回,在回溯时输出,但数组方法更为直观。
  3. 关键步骤

    • 读入与存储:使用循环读入整数 t,若 t != 0,则存入数组 a[mark] 并令 mark++;若 t == 0,则结束读入。
    • 倒序输出:从 mark - 11 遍历数组,逐个输出 a[i],每个数字后跟一个空格。
    • 输出格式:数字之间用空格分隔,末尾可跟空格(本题对格式要求不严格)。
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),其中 \(n\) 是输入中非零整数的个数,只需遍历两次(读入一次,输出一次)。
    • 空间复杂度:\(O(n)\),用于存储输入序列。
  5. 模拟与输出

    • 终止标志0 作为输入结束的标志,不参与输出,这是题目明确要求的。
    • 存储策略:使用数组存储所有有效数字,是因为需要反向访问,而单次遍历无法倒序输出,必须保存所有数据。
    • 适用场景:这类“先存储后反向处理”的问题非常常见,适用于需要逆序输出或逆序操作的场景。

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    int a[105];          // 定义数组:存储输入的数字序列
    int mark = 1;        // 定义变量:数组索引标记,初始为1
    int t;               // 定义变量:临时存储输入的数字

    // 循环读入数据到数组中,直到输入为0
    cin >> t;            // 读取第一个数字
    while (t != 0)       // 当输入不为0时继续循环
    {
        a[mark] = t;     // 将当前数字存入数组
        mark++;          // 数组索引后移
        cin >> t;        // 读取下一个数字
    }

    // 倒序输出数组中的数字
    for (int i = mark - 1; i >= 1; i--)
    {
        cout << a[i] << " ";  // 输出当前数字
    }

    return 0;            // 程序正常结束
}

【运行结果】

3 65 23 5 34 1 30 0
30 1 34 5 23 65 3
posted @ 2026-08-30 09:21  团爸讲算法  阅读(12)  评论(0)    收藏  举报