题目描述
输入描述
输 出描述
输出一个正整数,表示不大于 N 的数字,经过冰雹数变换过程中,最高冲到了多少。
输入输出样例
示例
输入
10
输出
52
``·
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 1194 | 总提交次数: 2468 | 通过率: 48.4%
难度: 困难 标签: 2016, 模拟, 省赛
代码:
#include <stdio.h>
typedef long long ll;
int main() {
ll max = 0, n, i, N;
// 从标准输入读取一个整数 N
scanf("%lld", &N);
// 外层循环,遍历从2到N的每一个整数
for (i = 2; i <= N; i++) {
n = i; // 将 n 初始化为当前的 i
// 使用while循环,直到 n 变为 1
while (n != 1) {
if (n % 2 == 0) {
n /= 2; // 如果 n 是偶数,则除以2
} else {
n = n * 3 + 1; // 如果 n 是奇数,则进行3n+1操作
}
// 更新 max 的值,记录出现的最大值
if (n > max) {
max = n;
}
}
}
// 输出找到的最大值 max
printf("%lld\n", max);
return 0;
}
代码分析:
-
数据类型和变量声明:
typedef long long ll;
:定义了ll
作为long long
类型的别名,用于处理大整数。ll max = 0, n, i, N;
:声明了四个ll
类型的变量,max
用于记录每个序列中出现的最大值,n
用于进行3n+1操作,i
用于循环计数,N
用于存储从标准输入读取的整数。
-
循环结构:
for (i = 2; i <= N; i++) { ... }
:外层循环从2开始,逐步增加到N,对每个整数进行处理。n = i;
:将n
初始化为当前的整数i
。
-
3n+1操作的计算:
while (n != 1) { ... }
:内层循环,直到n
变为1。if (n % 2 == 0) { n /= 2; }
:如果n
是偶数,则将n
除以2。else { n = n * 3 + 1; }
:如果n
是奇数,则进行3n+1操作。
-
记录最大值:
if (n > max) { max = n; }
:在每次迭代中,更新max
的值,记录当前序列中的最大值。
-
输出结果:
printf("%lld\n", max);
:最终输出找到的最大值max
。
总结:
这段代码的目的是找出从2到给定整数 N
中任意整数开始,按照3n+1规则最终生成的序列中的最大值。它通过遍历每个整数,使用循环计算直到序列达到1,并在计算过程中记录并更新出现的最大值。
标签:max,ll,冰雹,整数,long,最大值,3n From: https://blog.csdn.net/weixin_62881069/article/details/139816639