第十四届蓝桥杯模拟赛第二场第一期(python题解)上

能力有限,大伙将就看看吧!

填空题

第一题

问题描述
  请找到一个大于 2022 的最小数,这个数转换成二进制之后,
最低的 6 个二进制为全为 0 。
  请将这个数的十进制形式作为答案提交。

 本题可以使用python内置函数 bin( ) 来进行进制转换。转换后切片后六位与字符串进行比对,然后将结果输出。

for i in range(2023,4000):
    a = bin(i)[-1:-7:-1]
    if a == "000000":
        print(i)
        break

答案:2048

第二题

问题描述

 我们计从 1949 年 10 月 1 日至 1949 年 10 月 2 日为经过了 1 天。
 请问从 1949 年 10 月 1 日至 2022 年 1 月 1 日经过了多少天?

 本题可以使用蓝桥允许的datetime模块,进行快速求解。

import datetime

start = datetime.date(1949, 10, 1)
end = datetime.date(2022, 1, 1)
days = (end - start).days
print(days)

答案:26390

 第三题

扫描二维码关注公众号,回复: 17281599 查看本文章
问题描述 
8518 是一个非常特殊的数,如果把这个数看成 16 进制数,
它的值为 (8518)16=8*16*16*16+5*16*16+1*16+8=34072,而 34072 正好是 8518 的整数倍。
9558 也是这样一个数,当看成 16 进制时是 38232。
其实长度为 1 的数 0 到 9 都满足看成 16 进制后是自己的整数倍(1倍)。
请问,除开长度为 1 的数,最小的满足这样条件的数是多少?

 本题依旧使用python内置函数,进行进制转化。人生苦短,我用python!!(手动滑稽)

for i in range(10,8518):
    num = int(str(i),16)
    if num % i == 0:
        print(i)
        break

 答案:1038

 第四题

问题描述 
现在小蓝想从这个矩阵的第一行第一列画一条折线到第 30 行 60 列,线只能沿水平向右走或竖直向下走,只能在有数字的地方拐弯。小蓝想知道,这样一条线经过的数字的和最大是多少。
174094882455171152761423221685761892795431233411387427793198
650286024865090061389344606618496378829135984076361542097372
601657541200146071777733599818266038012509478351201640618984
143988087783837107349651099683484992553337438088068198972282
890781586124258626539246182119762952003918195325258677229419
698255491250839396799769357665825441616335532825361862146291
503649293440596342887581257444442930778730382520372975343211
325351222640703400531067500454956482168314849207060705673849
265774579830223671554026061117300483012903885770893074783710
083450145620356667677191627276513995926532444279237315785832
411595106453089134746365281031552217482363035280722591085079
053410485925413958279617719034175332412908745680774313630190
429314820559328748143552689295945058801322270313370955837837
939182801848609300876356583948397645861551964542532682663945
625356614462682551015176002433628234343684739800880514363921
982340231989891351425389287014819359798014755509282450440511
590838726938103384801541373585690893606978941566666714061214
952341523168827712604946036245881214982452998386986623826275
782780208928205527678781609589000725521486468983551558405472
149903035076783644195574734088152324666290493119955560594634
905391288186024902215444250421277955403412298227858394469856
607272647132163832860126054679347881638761723785858733108109
249157334220127702410373959720286708183036202841837581704881
367895556630088230650972282944827258473951902831431040790814
079538232104075905120989173307660289899942087873076421916033
622143260549608274076012938515668898707915863945382394851328
164677964192631597026176253407553188801750590935427267220117
591817866992665840378311257621611574856498432538327068011953
631534031790352912617015229051836886166704989498756486878095
690013558017746707412183571476823027885971347137127534455141

 本问题很像之前学习的硬币找零问题(应该是 dp )。矩阵的任意点的最大路径和等于此点左边点和上边点中,值大的那个点加上本点的路径值。所以从[1][1]开始按顺序依次递推,直至[30][60]。

# 存数字矩阵 30行60列
M, N = 40, 70
a = [[0] * N for _ in range(M)]
for i in range(1, 31):
    a[i][1:61:] = map(int, list(input()))

# 存储每个点路径最大值的矩阵
res = [[0] * N for _ in range(M)]
for i in range(1, 31):
    for j in range(1, 61):
        res[i][j] = max(res[i - 1][j], res[i][j - 1]) + a[i][j]

print(res[30][60])

答案:592

 第五题

问题描述
  将 2022 拆分成不同的质数的和,请问最多拆分成几个?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

 本题搬运第十四届蓝桥杯第二期模拟赛 【python】 (pythonmana.com)风信子的猫Redamancy 的题解。才疏学浅,仰望大佬。

思路:

这道题不同于质因数分解,是分成不同质数的和,所以简单的想法就是,求出2022中所有的质数,然后从小的数开始组合,看看组合多少个能得到2022。

不过这道题,我仔细想了想,还是要用到DFS,并且我们可以知道,第一个找到的一定是最长的,因为第一个找到的是从最小的开始找,所以这个DFS也就很好写了。

from math import sqrt
# 判断是否是素数
def judge_prime(n):
if (n == 0 or n == 1): return False
if (n == 2): return True
if (n % 2 == 0): return False
# 判断
if 0 in [n % i for i in range(2, int(sqrt(n) + 1))]:
return False
return True
def equal_prime(n):
'''n拆分成素数之和'''
# 首先筛选素数的列表
plist = [i for i in range(n + 1) if judge_prime(i)]
DFS(n, 0, 0, plist, S=set())
def DFS(n, index=0, sum_num = 0, primes=[], L=[], S=set()):
if sum_num > n:
return
if sum_num == n:
if (tuple(L) not in S): # 避免重复输出
print(L)
print(sum(L))
print(len(L))
exit(-1) # 第一个找到的一定是最大的
S.add(tuple(L))
# 只要index没有超过素数表primes的长度,就可以继续选择,超过了则不操作,迭代返回上一层
if (index < len(primes)):
# sum==n 找到了这样的一组数字
L.append(primes[index])
DFS(n, index + 1, sum_num + primes[index], primes, L, S)
L.pop()
DFS(n, index + 1, sum_num, primes, L, S)
equal_prime(2022)

答案:33 

感谢观看!!!

猜你喜欢

转载自blog.csdn.net/ygs_0827/article/details/128066985