备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))

备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
大家好,我是爱分享的小蓝,欢迎交流指正~ 备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片

全文目录
算式900?
传送锚点
思路点拨
【备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))】代码详解
神奇算式??
传送锚点
思路点拨
代码详解
带分数???
传送锚点??
思路点拨
代码详解
算式900? 传送锚点 备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
?

(□□□□-□□□□)*□□=900

备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
?
(5012-4987)*36=900

备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
?
思路点拨
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')

神奇算式?? 传送锚点 备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
?
210 x 6 = 1260 8 x 473 = 3784 27 x 81 = 2187

备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
?
思路点拨
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

带分数??? 传送锚点备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
? 输入样例
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

备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
?? 友友们,备战蓝桥最后17天,一起冲刺省赛一等奖!备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
?? 备战蓝桥杯|【蓝桥python冲刺17天】——如何轻松拿捏必考数论题((第三弹))
文章图片
?

    推荐阅读