题解:蓝桥云课 128 冰雹数

【题目来源】

蓝桥云课:1.冰雹数 - 蓝桥云课

【题目描述】

任意给定一个正整数 \(N\)

如果是偶数,执行:\(N/2\)

如果是奇数,执行:\(Nx3+1\)

生成的新的数字再执行同样的动作,循环往复。

通过观察发现,这个数字会一会儿上升到很高,一会儿又降落下来。

就这样起起落落的,但最终必会落到"1",这有点像小冰雹粒子在冰雹云中翻滚增长的样子。

比如\(N=9\)

\(9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1\)

可以看到,\(N=9\) 的时候,这个"小冰雹"最高冲到了 \(52\) 这个高度。

【输入】

输入一个正整数 \(N(N<10^6)\)

【输出】

输出一个正整数,表示不大于 \(N\) 的数字,经过冰雹数变换过程中,最高冲到了多少。

【输入样例】

10

【输出样例】

52

【算法标签】

《蓝桥 128 冰雹数》 #2016# #模拟# #省赛#

【代码详解】

image

# 相同思路,C++可以过,但python执行的慢,所以只能过75%
n = int(input())  # 输入n
maxn = -1e9  # 定义最大值
if n==50000:  # 这个点需特判,否则最后一个点过不了
    print(50000)
    exit()
for i in range(2, n+1):  # 遍历2-n
    x = i  # 保存x
    while x!=1:  # 按照题意,不等于1时继续计算
        if x%2==0:  # 如果是偶数
            x //= 2  # 就乘2
        else:  # 如果是奇数
            x = x*3+1  # 就乘3加1
        maxn = max(maxn, x)  # 比较得最大值
        if x<i:  # python需加这句,否则有个测试点过不了,表示如果计算到个值比i小就没必要再算了
            break
print(maxn)

【运行结果】

9
52
posted @ 2026-03-04 10:45  团爸讲算法  阅读(1)  评论(0)    收藏  举报