1.神奇的的算式 【Python|【蓝桥杯国赛真题】备战24天 Python】
文章图片
距离蓝桥杯24天
文章图片
快和小郑一起努力,下面的题解都会很详细,如有疑惑评论欢迎指出!
文章图片
坚持到最后!!!
文章图片
问题分析:左边的两个因数,长度只能是1,2,3其中之一,因此我们只需要枚举所有可能,加上判断即可(注意j>i,这样枚举所有情况的同时也能避免重复)参考代码(AC)
判断:条件1:左边两数的组成元素与右边结果的组成元素相同
条件2:右边结果长度为4,左边两数的组成元素互异
条件3:左右两数及右侧结果的数字 各自的组成元素不重复
tips:其实这些条件不是凭空想出来的,都是不断的尝试,发现错误,增加条件得到的。
#1*3,2*2,2*3,for i in range(1,1000):
for j in range(i+1,1000):
k=set(str(i*j))#右边数字的组成元素
t=set(str(i)+str(j))#左边两数的组成元素
if k==t:
if len(k)==4 and not set(' '.join(str(i)).split())&set(' '.join(str(j)).split()):#结果4位且i,j组成数字互异
if len(str(i))==len(set(str(i))) and len(str(j))==len(set(str(j))) and len(str(i*j))==len(set(str(i*j))):#确保i,j,i*j由不同数字组成
print(i,j,i*j)#数一下,一共12种
2.逐位求和
文章图片
问题分析: 签到题了,利用递归:每次遍历字符串,int字符元素并相加后再次调用自身,直至长度为1参考代码(AC)
n=input()def f(n):
if len(n)==1:
print(n)
else:
m=0
for i in n:
m+=int(i)
return f(str(m))
f(n)
3.最大乘积
文章图片
问题分析:这道题和第1题有相像。左边两个数字相乘最大不会超过999890001
因为你可以去尝试一下对于字符串'999999999'无论你怎么分割,得到的两个数字相乘后都不会超过哈。因而逆序循环,如果有因子(类似于判断质数),并符合判断条件,输出。
判断条件的设定:因子不含0且不重复,右侧的结果互异数字且长度9,左侧的两个因子合并后互异且长度为9
跑个大概5分钟吧结果出来(.....)
#839542176答案
def judge(x):
s=[]
for i in str(x):
if i not in s and i!='0':
s.append(i)
else:
return False
return Truedef g(x,y,z):
if not set(str(x))&set(str(y)):
if judge(z) and len(set(str(z)))==9:
return True
return Falsedef f(x):
for i in range(999890001,-1,-1):
if judge(i):
for j in range(1,int(i**0.5)+1):
if i%j==0:
if judge(j) and judge(i//j) and g(j,i//j,i):
print(i,j,i//j)
return 0
4.含2天数
文章图片
参考代码(AC)
import datetimest=datetime.date(1900,1,1)
delta=datetime.timedelta(days=1)
end=datetime.date(9999,12,31)cnt=0while st<=end:
if '2' in str(st.year) or '2' in str(st.month) or '2' in str(st.day):
cnt+=1
try:
st+=delta
except:
print(cnt)
break
问题分析:考察datetime模块的使用提取年,月,日 ,转化为字符串 ,如果存在‘2’,那么累加5.阶乘约数
注意except那里:由于datetime模块的年最大是9999,当st.year=9999,累加delta后会报错,实际上这时候也已经遍历完所有日期,直接输出cnt即可
文章图片
问题分析:考察数学定理,唯一分解定理:任何一个大于1的整数n都可以分解成若干个素因数的连乘积,如果不计各个素因数的顺序,那么这种分解是惟一的
举个例子,比如4!=24=2*2*2*3,2和3都是质数,那么问,4!即24有多少个正约数
第一种办法:枚举,直接数:1,2,3,4,6,8,12,24 ,显然有8个
第二种办法:24=(2^3)*(3^1) ,把每一项的指数取下来,各自+1,并相乘
即(3+1)*(1+1)=8种
原理:第一个括号内,即2^3,一共有4个因子,为什么?
因为可以把它列出来:2^0,2^1,2^2,2^3,
同理 3^1一共有2个因子,可以把它列出来:3^0,3^1,
那么根据乘法计数原理,原数就有4*2=8种因子
但一个细节的地方:我们需要保证因子之间互异,即在刚刚的例子里面,对于2^4,任意抽取一个因子,与3^1中的任意一个因子相乘,结果一定在所有的因子中(8种里面)是唯一的。
下面证明一定是互异的:假设n>1,将其分解,
文章图片
p1,p2,..pk都是质数,指数>=0,那么p1^α1有(α1+1)个因子
同理...pk^αk有(αk+1)个因子
从 p1^α1取一个因子a出来...一直到从..pk^αk取一个因子k出来,得到一条因子序列,最后把它相乘,会得到一个n的因子w。对于这个n的因子w,它是由若干个素因数连乘积得到,由定理可知,这种分解是唯一的,即w只能是由这条因子序列相乘得到。要证w是唯一的,即证这条因子序列是唯一的,显然,当我们对于(p1到pk),这每个质数选取一定的指数,那么这个序列必然是唯一的。证毕。
对于本题,就是要把100!分解成若干个质数相乘参考代码(AC)
我们可以直接分解:下面给出把n(>2)分解成若干个质数的板子
n=int(input()) i=2 s=[] while i<=n: if n%i==0: s.append(i) n//=i else: i+=1 print(s)
文章图片
但是对于本题不适用,因为100!太大了,跑不出来的。
转化一下思路:把100!看作100个数字相乘,即1*2*3..100
在对这100数字每个数进行质数分解即
100!=(1)*(2)*(3)*(2*2)*(5)*(2*3).....(2*2*5*5)
那么这样子,只需要遍历每个数字,碰到一个因子,就将其次数+1
比如一开始我们假设100!可以分解为m个2的乘积,
那我们只需要统计等式右边所有括号内2出现的总次数即得到m
m=[1 for i in range(101)]#m[i]:表示质数i出现的次数,初始化1表示不选的情况for i in range(1,101):
j=2
s=[]
tmp=i
while j<=tmp:
if tmp%j==0:
m[j]+=1
tmp//=j
s.append(j)
else:
j+=1
ans=1
for i in m:
ans*=iprint(ans)
文章图片
学习犹如逆水行舟不进则退 祝大家都能在蓝桥杯省赛中取得理想成绩
有什么不懂的欢迎留言指出!
推荐阅读
- 第六届蓝桥杯国赛:机器人繁殖从公式推导到C++/Python的实现
- Python|【蓝桥杯真题】Python备战28天
- 备战蓝桥杯|2020年第十一届蓝桥杯省赛Python组(真题+解析+代码)(跑步锻炼)
- 蓝桥杯|蓝桥杯——机器人行走
- 蓝桥杯|【蓝桥杯】【python】扫地机器人-烂尾楼+1
- 算法|语义分割算法分享之Swin-Transformer
- python|数据增强操作(旋转、翻转、裁剪、色彩变化、高斯噪声等)
- OCR|使用挤压、哈哈镜、扭曲进行文字图像增强
- 深度学习|使用tensorboard时踩的坑