一、问题描述
如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。 请问,2024 的最大的质因数是多少?
1、思路:质数判定
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
3、结果:23
二、问题描述
对于两个整数 a, b,既是 a 的整数倍又是 b 的整数倍的数称为 a 和 b 的公倍数。公倍数中最小的正整数称为 a 和 b 的最小公倍数。 请问,2024 和 1024 的最小公倍数是多少?
1、思路:暴力枚举
2、代码:
res = 2024
while True:
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]。
2、代码:
def min_cost(y):
dp = [float('inf')] * (y + 1)
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)))
if i + max_digit <= y:
dp[i + max_digit] = min(dp[i + max_digit], dp[i] + 3)
# 乘 2
if i * 2 <= y:
dp[i * 2] = min(dp[i * 2], dp[i] + 10)
return dp[y]
print(min_cost(2024))


