文章图片
大家好,我是爱分享的小蓝,欢迎交流指正~
文章图片
全文目录
算式900?
传送锚点
思路点拨
【备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))】代码详解
神奇算式??
传送锚点
思路点拨
代码详解
带分数???
传送锚点??
思路点拨
代码详解
算式900?
传送锚点
文章图片
?
(□□□□-□□□□)*□□=900
文章图片
?
(5012-4987)*36=900
文章图片
?
思路点拨
1、审题:先看题目给出的条件:“这 10 个方块刚好包含了 0 ~ 9 中的所有数字”。代码详解
2、建模:看到熟悉的题目条件,条件反射全排列函数permutations(??? )
3、判断:枚举所有排列情况,用字符串分割出方块a,b,c=int(s[:4]),int(s[4:8]),int(s[8:])
条件判断一下if (a-b)*c==900: ,打印符合条件的情况print(a,b,c) ,看哪个最合适就选它。
#数论排列-算式900
from itertools import permutations as per#导入全排列函数
for per in per('1234567890'):#('6', '0', '4', '8', '5', '9', '7', '3', '1', '2')
s=''.join(per)#6048597312
a,b,c=int(i[:4]),int(i[4:8]),int(i[8:])#字符串分割
if (a-b)*c==900:#(6048-5973)*12==900
print(a,b,c)#print('(6048-5973)*12=900')
神奇算式?? 传送锚点
文章图片
?
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
文章图片
?
思路点拨
1、审题:遇到这种数论题,一定要细心,挖掘出题目中所有的隐藏条件。代码详解
条件1:“4个不同数字”。
条件2:“满足乘法交换律的算式算作同一种情况”。
条件n:······
2、建模:思考自己的手上有哪些函数,可以高效快捷地搭建模型,解决问题。
比如数论常考的函数:str()list()sorted()set()len()
3、解题:
因为算式左边的数字很小,最大只有一千,所以我们选择二层循环遍历每种情况。
第一步遍历了所有情况,接下来就是按照条件筛选了。
把手里的工具组合起来,整数int转换成字符串str(),字符串转换成字符列表list()
再排个序sorted() 这个时候范围已经缩小了很多。
接下来继续筛选,打印现在的输出 print(i,j,i*j) ,看看哪些不符合条件。
测试输出:750*906=679500,确实有4个不同数字,但跟题目给的样例差距太大了。
所以我们可以看出还有隐藏条件需要挖掘,再进行筛选,加个if判断。
750*906 不能重复set(), 并且长度应该是4,所以要满足len(set(s))==len(set(t))==4
观察i*j=679500,发现数值超过范围10000,所以需要增加数字范围约束1000
#数论组合-神奇算式
cnt=0
for i in range(1,1000):
for j in range(i+1,1000):#i+1:满足小*大的不重复算式
s=sorted(list(str(i)+str(j)))#['0','1','2','6'] 210 x 6
t=sorted(list(str(i*j)))#['0','1','2','6'] 1260
if s==t and len(set(s))==len(set(t))==4 and 1000
带分数??? 传送锚点
文章图片
? 输入样例
100
输出样例
11
思路点拨
1、审题:先看题目给出的条件:“100 = 82 + 3546 / 197”。代码详解
转换成python的数学语言,n=a+b//c 。
2、建模:看到熟悉的题目条件,条件反射全排列函数permutations(??? )
3、处理:老规矩,将字符串切割成3块,对应题目里的a,b,c,刚好满足不重复的条件。
接下来最重要的环节就是b和c怎么区分?a和b可以套一层循环遍历,但再套一层就变成O(n^3)太大了,所以需要巧劲,找一个精准的切入点:确定b索引的最后一个位置。
通过转换公式:n=a+b//c→b=(n-a)*c→bnum=(n-a)*int(s[-1])%10
通过%10操作取到乘积的最后一位,也就是b的最后一位。
定位完毕!接下来就简单了,去掉不符合题目的条件continue,if判断满足条件的情况。
4、说明:这题蓝桥云课检测可能会超过时间限制,具体看你的网速ms
同样的代码,小蓝网速慢超时了,评论区的大佬网速快,从不超时(*/ω\*)
#数论排列-带分数
from itertools import permutations as per
n=int(input())#100
cnt=0
for per in per('123456789'):
s=''.join(per)
for i in range(len(str(n))):
a=int(s[:i+1])
bnum=(n-a)*int(s[-1])%10
if bnum==0:
continue#如果出现0,跳出循环加速
b_index=s.index(str(bnum))
if b_index<=i or b_index>=8:
continue#如果b的索引在a和c里,跳出循环加速
b=int(s[i+1:b_index+1])
c=int(s[b_index+1:])
if a+b/c==n:
cnt+=1
print(cnt)#11
文章图片
?? 友友们,备战蓝桥最后17天,一起冲刺省赛一等奖!
文章图片
??
文章图片
?
推荐阅读
- 备战蓝桥杯|【蓝桥python冲刺31天】——如何轻松拿捏必考数论题((第一弹))
- #|python opencv 图像像素处理基础
- 神经网络|【论文导读】浅谈胶囊网络与动态路由算法
- 图像处理与机器视觉|LM算法
- Python科学计算和数据分析|Seaborn系列(五)(回归(Regression)及矩阵(Matrix)绘图)
- 10行代码实现一个值班提醒应用
- 用Markdown写邮件,用Python发邮件
- ffmpeg|bilibili缓存视频批量转换成mp4格式,方便学习
- Python|每天弄个小爬取之Python爬取批量爬取B站小视频!