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

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

全文目录

算式900⭐

传送锚点

 思路点拨

代码详解  

神奇算式⭐⭐

传送锚点

 思路点拨

代码详解  

带分数⭐⭐⭐

传送锚点​​

 思路点拨

代码详解  


算式900⭐

传送锚点

【蓝桥python冲刺17天】——如何轻松拿捏必考数论题?(第三弹)_第1张图片

  (□□□□-□□□□)*□□=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')

神奇算式⭐⭐

传送锚点

【蓝桥python冲刺17天】——如何轻松拿捏必考数论题?(第三弹)_第2张图片

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

带分数⭐⭐⭐

传送锚点【蓝桥python冲刺17天】——如何轻松拿捏必考数论题?(第三弹)_第3张图片

 输入样例

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的最后一位。

定位完毕!接下来就简单了,去掉不符合题目的条件continueif判断满足条件的情况。

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,算法)