全文目录
算式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