题解:洛谷 P5727 【深基5.例3】冰雹猜想

【题目来源】

洛谷:P5727 【深基5.例3】冰雹猜想 - 洛谷

【题目描述】

给出一个正整数 \(n\),然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 \(3\) 再加 \(1\),否则除以 \(2\)。经过若干次循环后,最终都会回到 \(1\)。经过验证很大的数字 \((7\times 10^{11})\) 都可以按照这样的方式比变成 \(1\),所以被称为“冰雹猜想”。例如当 \(n\)\(20\),变化的过程是 \(20→10→5→16→8→4→2→1\)

根据给定的数字,验证这个猜想,并从最后的 1 开始,倒序输出整个变化序列。

【输入】

输入一个正整数 \(n\)

【输出】

输出若干个由空格隔开的正整数,表示从最后的 \(1\) 开始倒序的变化数列。

【输入样例】

20

【输出样例】

1 2 4 8 16 5 10 20

【算法标签】

《洛谷 P5727 冰雹猜想》 #模拟#

【代码详解】

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

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    int n;               // 定义变量:初始数字
    int a[5000];        // 定义数组:存储Collatz序列
    int mark = 1;       // 定义变量:数组索引标记,初始为1
  
    cin >> n;           // 输入初始数字
    a[mark] = n;        // 将初始数字存入数组
    mark++;             // 数组索引后移
  
    // 生成Collatz序列直到n变为1
    while (n != 1)      // 当n不等于1时继续循环
    {
        if (n % 2 == 0) // 如果n是偶数
            n /= 2;     // n除以2
        else            // 如果n是奇数
            n = n * 3 + 1;  // n乘以3加1
      
        a[mark] = n;    // 将当前数字存入数组
        mark++;         // 数组索引后移
    }
  
    // 倒序输出Collatz序列
    for (int i = mark - 1; i >= 1; i--) 
    {
        cout << a[i] << " ";  // 输出当前数字
    }
  
    return 0;           // 程序正常结束
}

【运行结果】

20
1 2 4 8 16 5 10 20 
posted @ 2026-02-16 15:39  团爸讲算法  阅读(1)  评论(0)    收藏  举报