> 技术文档 > 2024第十六届蓝桥杯模拟赛(第二期)-Python_蓝桥杯模拟赛第二期python

2024第十六届蓝桥杯模拟赛(第二期)-Python_蓝桥杯模拟赛第二期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 Truefor 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=2024while(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 = 0for x in range(1, 2025): if (x ^ 2024) < 2024: count += 1print(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))) # 找到当前数的最大数位