一级
C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++一级练习 luogu-B2077, 角谷猜想
📅 2024-11-30·✍️ OneCoder·计算中...·⏱️ 5 分钟
#GESP#C++#基础语句
GESP一级循环和基本运算练习,略有难度,尤其容易忽略数据类型选择的问题,难度★✮☆☆☆。
luogu-B2077
题目要求
题目描述
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 加 ,如果是偶数,则除以 ,得到的结果再按照上述规则重复处理,最终总能够得到 。如,假定初始整数为 ,计算过程分别为 、 、 、 、 。
程序要求输入一个整数,将经过处理得到 的过程输出来。
输入格式
一个正整数 。
输出格式
从输入整数到 的步骤,每一步为一行,每一部中描述计算过程。最后一行输出
End。如果输入为 ,直接输出End。
样例输入 #1
CONSOLE
1 行
5
样例输出 #1
CONSOLE
6 行
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End
题目分析
-
输入处理:
- 输入是一个正整数 ( ),该值的范围是 ,所以我们需要确保程序能够正确处理大范围的整数。
- 由于进行乘法操作时,可能会产生较大的数值,因此我们选择使用
long long数据类型来存储整数,避免溢出。
-
处理过程:
- 判断奇偶性:每次处理一个整数时,需要判断它是奇数还是偶数:
- 如果是偶数,执行
n = n / 2,使数值减半。 - 如果是奇数,执行
n = 3n + 1,使数值增加。
- 如果是偶数,执行
- 输出每一步:在每次操作后,需要输出当前的数值和本次计算的过程。例如,若当前数值是奇数,则输出
n * 3 + 1;若是偶数,则输出n / 2。 - 终止条件:当
n的值变为 1 时,停止循环,并输出"End"表示处理完成。
- 判断奇偶性:每次处理一个整数时,需要判断它是奇数还是偶数:
-
核心算法:
- 使用一个
while循环来处理数值n,直到它变为 1。 - 在循环内部,判断
n是奇数还是偶数,并根据不同的条件进行相应的计算。每次计算后,更新n的值,并输出当前的操作过程。 - 当
n变为 1 时,输出"End"并结束程序。
- 使用一个
-
数据类型:
- 由于输入的整数可能非常大,且在计算过程中进行乘法和除法操作,选择
long long类型来存储整数,以防止溢出。
- 由于输入的整数可能非常大,且在计算过程中进行乘法和除法操作,选择
示例代码
C++
28 行
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
long long n; // 用 long long 类型来存储输入的数,防止大数溢出
scanf("%lld", &n); // 读取输入的整数,使用 %lld 来处理 long long 类型
long long ans = 0; // ans 用来存储当 n 是奇数时 3n + 1 的结果
long long sum = 0; // sum 用来存储当 n 是偶数时 n / 2 的结果
// 当 n 不等于 1 时,继续进行计算
while (n != 1) {
if (n % 2 != 0) { // 如果 n 是奇数
ans = n * 3 + 1; // 奇数时执行 3n + 1
cout << n << "*3+1=" << ans << "\n"; // 输出当前操作的过程
n = ans; // 更新 n 为计算后的值
} else { // 如果 n 是偶数
sum = n / 2; // n / 2
cout << n << "/2=" << sum << "\n"; // 输出当前操作的过程
n = sum; // 更新 n 为计算后的值
}
}
// 当 n == 1 时,输出 "End" 表示结束
printf("End");
return 0;
}
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
读者讨论与留言
💬 还没有读者留言,快来成为第一个讨论者吧!