全网最详细蓝桥杯真题+解析+代码,绝对通俗易懂,一点就通!
专治各种没资源,没思路,没代码等新手入门级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:答疑
难度系数:⭐
考察题型:枚举
涉及知识点:字符串
思路分析:
蓝桥杯经典开头——字符串。
万能str()+count()可以解决99%的蓝桥杯第一题。
cnt=0 #计数器初始化
for i in range(1,2021): #遍历公元1年到2020年
if str(i).count("2")>0: #如果年份中至少有一个2
cnt+=1 #计数器+1
print(cnt) #输出结果:563
难度系数:⭐
考察题型:枚举 数论
涉及知识点:遍历 合数
思路分析:
呈上遍历题通用套路ヾ(•ω•`)o
1.先让计数器置0.
2.再遍历一堆数字。
3.如果满足条件则计数器加一。
4.最后输出统计结果。
具体结合楼下代码食用,思路会更加清晰。
#判断合数
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
难度系数:⭐⭐⭐
考察题型:数论
涉及知识点:约数定理
思路分析:
一开始我是想着直接分解因数,结果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)
#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
难度系数:⭐⭐⭐
考察题型:动态规划
涉及知识点:DP子序列
思路分析:数组含义→数组赋值→遍历顺序→递推公式→打印数组
dp[i] #i:序列的编号 #dp:递增子序列的个数
dp=[1]*len(s) #dp:递增子序列的个数初始化为1
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)) #输出结果为数组计数之和
#本质上升序列
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
持续更新中······
持续更新中······
持续更新中······