【蓝桥真题】——2020年蓝桥python组国赛真题+解析+代码(通俗易懂版)

 大家好,我是爱学习的小蓝,欢迎交流指正~ 

全网最详细蓝桥杯真题+解析+代码,绝对通俗易懂,一点就通!

专治各种没资源,没思路,没代码等新手入门级BUG


全文目录

⭐试题A:美丽的2

1 真题

2 解析

3 代码

⭐试题B:合数个数

1 真题

2 解析

3 代码

⭐试题C:阶乘约数

1 真题

2 解析

3 代码

⭐⭐试题D:本质上升序列

1 真题

2 解析

 第一步:明白dp[j]的含义

第二步:给dp数组初始化赋值

第三步:弄清dp[j]遍历的顺序

第四步:搞懂递推公式

第五步:打印数组

3 代码

⭐⭐​​​​​​​⭐试题E:玩具蛇

⭐​​​​​​​⭐​​​​​​​⭐试题F:天干地支

⭐​​​​​​​⭐​​​​​​​⭐试题H:答疑


试题A:美丽的2

1 真题

【蓝桥真题】——2020年蓝桥python组国赛真题+解析+代码(通俗易懂版)_第1张图片


2 解析

难度系数:⭐

考察题型:枚举

涉及知识点:字符串

思路分析:

蓝桥杯经典开头——字符串。

万能str()+count()可以解决99%的蓝桥杯第一题。


3 代码

cnt=0                         #计数器初始化
for i in range(1,2021):       #遍历公元1年到2020年
    if str(i).count("2")>0:   #如果年份中至少有一个2
        cnt+=1                #计数器+1
print(cnt)                    #输出结果:563

试题B:合数个数

1 真题

【蓝桥真题】——2020年蓝桥python组国赛真题+解析+代码(通俗易懂版)_第2张图片


2 解析

难度系数:⭐

考察题型:枚举 数论

涉及知识点:遍历 合数

思路分析:

呈上遍历题通用套路ヾ(•ω•`)o

1.先让计数器置0.

2.再遍历一堆数字。

3.如果满足条件则计数器加一。

4.最后输出统计结果。

具体结合楼下代码食用,思路会更加清晰。


3 代码

#判断合数
def heshu(x):
    for i in range(2,x):
        if x%i==0:
            return True
    return False

#主函数
cnt=0
for i in range(1,2021):     #遍历1~2020
    if heshu(i)==True:      #如果判断为合数
        cnt+=1              #计时器+1
print(cnt)                  #输出结果:1713
    

试题C:阶乘约数

1 真题


2 解析

难度系数:⭐⭐⭐

考察题型:数论

涉及知识点:约数定理

思路分析:

一开始我是想着直接分解因数,结果100!的时间复杂度实在太大。

所以这道题只能靠巧取解决。搬出适合本题的工具↓

质数-唯一分解公式

质数有2、3、5、7、11、13······

比如18=2*3*3(p1=2,a1=1;p2=3,a2=2)

约数个数=(a1+1)(a2+1)=(1+1)(2+1)=6  (分别是:1,2,3,6,9,18)


3 代码

#1.创建1~100的质数集
def prime(x):
    for i in range(2,int(x**0.5)+1):
        if x%i==0:
            return False
    return True
zhishu=[]
for i in range(2,101):
    if prime(i)==True:
        zhishu.append(i)
#zhishu=[2,3,5,7,11···,97]
        
#2.计算约数个数
p=[0]*101                #创建计数数组
for num in range(1,101): #遍历1~100
    x=num                #当前变量赋值
    for i in zhishu:     #遍历质数数组
        while x%i==0:    #判断约数
            p[i]+=1      #对应计数+1
            x//=i        #循环条件
#p=[0, 0, 97···0,0]
            
#3.遍历结果
ans=1
for i in range(1,101):   #遍历1~100
    if p[i]!=0:          #计数数组不为0
        ans*=(p[i]+1)    #根据公式累乘
print(ans)               #39001250856960000

试题D:本质上升序列

1 真题

【蓝桥真题】——2020年蓝桥python组国赛真题+解析+代码(通俗易懂版)_第3张图片

【蓝桥真题】——2020年蓝桥python组国赛真题+解析+代码(通俗易懂版)_第4张图片


2 解析

难度系数:⭐⭐⭐

考察题型:动态规划 

涉及知识点:DP子序列

思路分析:数组含义数组赋值遍历顺序递推公式打印数组

 第一步:明白dp[j]的含义

dp[i]     #i:序列的编号     #dp:递增子序列的个数

第二步:给dp数组初始化赋值

dp=[1]*len(s)      #dp:递增子序列的个数初始化为1

第三步:弄清dp[j]遍历的顺序

for i in range(len(s)):     #先遍历每个字符
    for j in range(i):      #再遍历当前字符前的所有字符

第四步:搞懂递推公式

if s[i]>s[j]:       #如果当前字符大于以前的字符
    dp[i]+=dp[j]    #把当前字符添加到前面递增子序列的末尾    
if s[i]==s[j]:      #如果当前字符等于以前的字符  
    dp[i]-=dp[j]    #去掉重复字符个数

第五步:打印数组

print(sum(dp))              #输出结果为数组计数之和

3 代码

#本质上升序列
s='tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl'
dp=[1]*len(s)               #dp:递增子序列的个数初始化为1
for i in range(len(s)):     #遍历0~len(s)-1
    for j in range(i):      #遍历0~i-1
        if s[i]>s[j]:       #如果当前字符大于以前的字符
            dp[i]+=dp[j]    #把当前字符添加到前面递增子序列的末尾    
        if s[i]==s[j]:      #如果当前字符等于以前的字符  
            dp[i]-=dp[j]    #去掉重复字符个数
print(sum(dp))              #输出结果:3616159


试题E:玩具蛇

持续更新中······


试题F:天干地支

持续更新中······


试题H:答疑

持续更新中······


 ​​​​​​​最后祝福小伙伴们轻轻松松拿下国一!​​​​​​​

你可能感兴趣的:(备战蓝桥,蓝桥杯,python,职场和发展,算法)