P5727 【深基5.例3】冰雹猜想

循环模拟 / 奇偶分支 / 序列倒序输出

一、先回答问题

这题到底在考什么

按奇偶规则把 n 变到 1,边变边存整个序列,最后从后往前输出。

对象

保留当前 n 和保存路径的 vector;每一步只根据当前 n 的奇偶决定下一项。

为什么能这样做

因为输出顺序和生成顺序相反,必须先存下来,或者递归/栈式输出。对二级最稳的是 vector。

先避开的坑

题目要求倒序输出,不能按变化过程正序输出。

二、互动演示

n=20 的变化过程

演示进度

课堂要求:每一步都让学生说出当前保留了什么信息,以及下一步为什么不会漏答案。

三、手推结果

把关键过程写成表

当前数规则下一项
20偶数 /210
10偶数 /25
5奇数 *3+116
16偶数 /28
四、自己选答案

当堂检查

n=5 的下一项是什么?
为什么要用 vector 存序列?
五、C++14 参考代码

代码读慢一点

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long n;
    cin >> n;

    vector<long long> v;
    v.push_back(n);
    while (n != 1) {
        n = (n % 2) ? n * 3 + 1 : n / 2;
        v.push_back(n);
    }

    for (int i = (int)v.size() - 1; i >= 0; i--) {
        cout << v[i] << " \n"[i == 0];
    }
    return 0;
}

读代码抓这几处

六、收口

复杂度与常见错误

复杂度:时间和空间都与序列长度成正比。

源文件:GESP2/P5727.md · GESP2/P5727_solution.md