题解:洛谷 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
浙公网安备 33010602011771号