第16届蓝桥杯模拟赛解答 填空题题解(python版)
在这里先给出填空题题解,后续会给出大题题解。在我所有代码中,除了使用少量必要内置函数外,我并未使用任何一个库,这样我才认为是真正的程序设计。
1、2024的质因数个数
1.1 思路:简单粗暴,用暴力解题即可。值得注意的是在寻找质数的过程中,偶数是不可能为质数的,所以第一个循环的步长为2;而在对应数的平方根之前的所有数,都是有对应的数去对应的,所以第二个循环的范围缩小很多(这是个数学方面的知识);
1.2 答案:3
1.3 代码:
n = []
for i in range(1,2025,2):
a = True
for j in range(2,int(i**0.5)+1):
if i % j == 0:
a = False
if a == True and 2024 % i == 0:
n.append(i)
print(len(n))
2、2024开方多少次为1
2.1 思路:还是暴力。
2.2 答案:4
2.3 代码:
n = 2024
count = 0
while n > 1:
n = int(n**0.5)
count += 1
print(count)
3、几的三次方大于2024
3.1 思路:这是个实实在在的算数题,逻辑思维不大,找到最小的一个数的三次方大于2024的,然后减去2024即可。这里循环的范围靠感觉设定即可,
3.2 答案:173
3.3 代码:
n = 0
for i in range(1,100):
if i ** 3 >= 2024:
n = i ** 3 - 2024
break
print(n)
4、日期问题
4.1 思路:这题是蓝桥杯的常见题目,每年都会来一题与月份,年份相关的题目。这个其实也是暴力,把从1901年到2024年的所有天数偏历一次并加以判断即可。
4.2 答案:762
4.3 代码:
def A(year): # 判断是否为闰年
if (year % 4 == 0 and year % 100 != 0) or (year % 400) == 0:
return True
else:
return False
def B(year,month): #给出对应月份的天数
if month == 2 and A(year):
return 29
elif month == 2 and not A(year):
return 28
elif month in [4,6,9,11]:
return 30
else:
return 31
def C(start_year,end_year):
count = 0
day_week = 1
for year in range(start_year,end_year+1):
for month in range(1,13):
for day in range(1,B(year,month)+1):
if day % 10 == 1 and day_week == 0:
count += 1
day_week = (day_week + 1) % 7
return count
print(C(1901,2024))
5、异或后的平方和最小
5.1 思路 也是暴力解题,逻辑性不大。这个数v肯定不超过这30个整数的最大数(假设 V 超过了这 30 个数的最大数 M,那么 V 在某些位上会有额外的 1,而这些额外的 1 会在异或运算中影响结果。具体来说,如果 V 的某一位上有 1,而所有 xi 在这一位上都是 0,那么 xi⊕V 在这一位上都会变成 1,从而增加平方和。)这里面涉及了一些数学上的理解,其实写题的时候可以把这个数设置的大一点,不用考虑这么多,反正已经是使用暴力了。
5.2 答案:1070293541
5.3 代码:
n = [9226, 4690, 4873, 1285, 4624, 1596, 6982, 590, 8806, 121, 8399, 8526, 5426, 64, 9655, 7705, 3929, 3588, 7397, 8020, 1311, 5676, 3469, 2325, 1226, 8203, 9524, 3648, 5278, 8647]
a = max(n)
min_squared_sum = float('inf')
for i in range(a + 1):
xor_results = [x ^ i for x in n]
squared_sum = sum(x ** 2 for x in xor_results)
if squared_sum < min_squared_sum:
min_squared_sum = squared_sum
best_V = i
print(min_squared_sum)
作者:丁八万