2024第十六届蓝桥杯模拟赛(第二期)-Python

提示:前五题是填空,不需要提交代码。


知识点:

1、质因数、质数、约数。

2、动态规划(dp)。

3、思维。 


 

一、【问题描述】

如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。

请问, 2024 的最大的质因数是多少?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

1、思路:质数的判定https://www.acwing.com/file_system/file/content/whole/index/content/4443622/

2、代码:

def is_prime(x):
    if x == 1:
        return False
    for i in range(2, int(x ** 0.5) + 1):
        if x % i == 0:
            return False
    return True

for i in range(2023,1,-1):
    if(2024%i==0):
        if(is_prime(i)):
            print(i)
            break
        else:
            continue

3、结果:23

 


 

二、【问题描述】

对于两个整数 a, b,既是 a 的整数倍又是 b 的整数倍的数称为 a 和 b 的公倍数。公倍数中最小的正整数称为 a 和 b 的最小公倍数。

请问, 2024 和 1024 的最小公倍数是多少?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

1、思路:暴力

2、代码:

res=2024
while(1):
    if(res%2024==0 and res%1024==0):
        print(res)
        break
    else:
        res+=1

3、结果:259072

 


三、【问题描述】

两个数按位异或是指将这两个数转换成二进制后,最低位与最低位异或作为结果的最低位,次低位与次低位异或作为结果的次低位,以此类推。

例如,3 与 5 按位异或值为 6 。

请问,有多少个不超过 2024 的正整数,与 2024 异或后结果小于 2024 。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

1、思路:暴力

2、代码:

count = 0
for x in range(1, 2025):
    if (x ^ 2024) < 2024:
        count += 1

print(count)

3、结果:2001

 


四、【问题描述】

小蓝有一个整数,初始值为 1 ,他可以花费一些代价对这个整数进行变换。

  • 小蓝可以花费 1 的代价将整数增加 1 。

  • 小蓝可以花费 3 的代价将整数增加一个值,这个值是整数的数位中最大的那个(1 到 9)。

  • 小蓝可以花费 10 的代价将整数变为原来的 2 倍。

例如,如果整数为 16,花费 3 将整数变为 22 。

又如,如果整数为 22,花费 1 将整数变为 23 。

又如,如果整数为 23,花费 10 将整数变为 46 。

请问,如果要将整数从初始值 1 变为 2024,请问最少需要多少代价?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

1、思路:动态规划


(1)初始化: 创建一个长度为y+1的dp数组,dp[i]表示将1变成i的最小代价,初始化为无穷大,dp[1] = 0。
(2)遍历每个数: 遍历从1到y,对于每个数i,尝试三种操作。
(3)加1操作: 若i + 1 <= y,更新dp[i + 1]为min(dp[i + 1], dp[i] + 1)。
(4)加最大数位操作: 计算当前数i的最大数位max_digit,若i + max_digit <= y,更新dp[i + max_digit]。
(5)乘2操作: 若i * 2 <= y,更新dp[i * 2]为min(dp[i * 2], dp[i] + 10)。
(6)返回结果: 最终返回dp[y],即将1变为y的最小代价。

 

2、代码:

def min_cost(y):
    dp=[float('inf')]*(y+1)
    # dp[x]表示将整数1变为x的最小代价
    dp[1]=0
    for i in range(1, y + 1):
        #加1
        if i+1<=y:
            dp[i+1]=min(dp[i+1], dp[i]+1)

        #加最大数位
        max_digit=int(max(str(i)))  #
评论 78
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值