冰雹数

题目描述

72052c774d0b4970ad14b04dae3a04a1.png

输入描述

6b9493dd807244558abd4a7ff24a7451.png

输 出描述

输出一个正整数,表示不大于 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;
}

代码分析:

  1. 数据类型和变量声明

    • typedef long long ll;:定义了 ll 作为 long long 类型的别名,用于处理大整数。
    • ll max = 0, n, i, N;:声明了四个 ll 类型的变量,max 用于记录每个序列中出现的最大值,n 用于进行3n+1操作,i 用于循环计数,N 用于存储从标准输入读取的整数。
  2. 循环结构

    • for (i = 2; i <= N; i++) { ... }:外层循环从2开始,逐步增加到N,对每个整数进行处理。
    • n = i;:将 n 初始化为当前的整数 i
  3. 3n+1操作的计算

    • while (n != 1) { ... }:内层循环,直到 n 变为1。
    • if (n % 2 == 0) { n /= 2; }:如果 n 是偶数,则将 n 除以2。
    • else { n = n * 3 + 1; }:如果 n 是奇数,则进行3n+1操作。
  4. 记录最大值

    • if (n > max) { max = n; }:在每次迭代中,更新 max 的值,记录当前序列中的最大值。
  5. 输出结果

    • printf("%lld\n", max);:最终输出找到的最大值 max

总结:

这段代码的目的是找出从2到给定整数 N 中任意整数开始,按照3n+1规则最终生成的序列中的最大值。它通过遍历每个整数,使用循环计算直到序列达到1,并在计算过程中记录并更新出现的最大值。

 

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值