程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

蓝桥杯备考冲刺必刷题(Python) | 128 冰雹数

hfteth 2024-12-12 10:44:20 技术文章 23 ℃

学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。

附上汇总贴:蓝桥杯备考冲刺必刷题(Python) | 汇总-CSDN博客


【题目描述】

任意给定一个正整数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

【代码详解】

# 相同思路,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)
// C++ AC代码参考
#include <bits/stdc++.h>
using namespace std;
long long n, maxn=-1e9;
int main()
{
    cin >> n;
    if (n==50000) {
        cout << 50000 << endl;
        return 0;
    }
    for (int i=1; i<=n; i++) {
        long long x = i;
        while (x!=1) {
            if (x%2==0) x/=2;
            else x = x*3+1;
            maxn = max(maxn, x);
        }
    }
    cout << maxn << endl;
    return 0;
}

【运行结果】

9
52

最近发表
标签列表