题目
Smallest multiple
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all
of the numbers from 1 to 20?
最小公倍数
2520是最小的能够被1到10整除的数。
最小的能够被1到20整除的正数是多少?
解法一
暴力循环解题
依次加1,
用这个方法解决1-10还是可以的,解决1-20就太浪费时间了,至少要跑10分钟
n = 20 sn = n while True: for i in range(1,n+1): if sn%i == 0: pass else: sn+=1 break else: break if sn%10000==0: print(sn) print(sn)
解法二
利用质数求解
其实题目就是想让求1-20 的最小公倍数,
而质数的公倍数就是质数相乘
例:2,3,5的公倍数 就是2 * 3 * 5 = 30
我们可以利用这个性质先求出来所有质数的公倍数 skip 、
又因为最后的结果,也要是质数的倍数,所以,结果也是skip的倍数
我们以skip为步长,依次判断
经过最后的测试,时间仅需要:0.000997304916381836
n = 20 # 1-n skip = 1 for i in range(1,n+1): # 求里面的质数的乘积,因为质数互质, if fs(i): skip *= i # 最后求出的数一定是skip的倍数,只有是skip的倍数,才能满足所有的质数为它的因子 bei = 1 while True: skip2 = bei*skip # 求倍数 for i in range(1,n+1): if skip2%i!=0: # 如果不满足1-n为它的因数,就增加一倍 bei+=1 break else: # for else 结构自己在看看,当1-n所有的数都是 skip2 的因数,跳出while循环 break print(skip2)