提示:前五题是填空,不需要提交代码。
知识点:
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))) #