问题
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-20的最小公倍数,我们可以先求两个数字的最小公倍数,再将其扩展到多个数字的最小公倍数。
-
根据 两个数字的最小公倍数 * 两个数字的最大公因数 = 两个数字的乘积 这一规律,要求解两个数字的最小公倍数,我们可以先求解两个数字的最大公因数。
-
最大公因数可以使用辗转相减法求解。
辗转相减法
用较大的数字减去较小的数字,直到两个数字相同时,相同数字即为两个数字的最大公因数。
举例:求解(35,28)的最大公因数
(35,28)中,35较大,用35减去28
->(7,28)中,28较大,用28减去7
->(7,21)中,21较大,用21减去7
->(7,14)中,14较大,用14减去7
->(7,7),两数字相同,即7为35和28的最大公因数
代码实现(python)
# # 先使用辗转相减法法计算两个数的最大公因数,再由此计算两个数的最小公倍数,最后再将两个数的最小公倍数扩展至多个数的最小公倍数
import numpy as np
# # 求两个数字的最大公因数
def cofactor_2(a, b):
while a != b:
if a > b:
a = a - b
elif a < b:
t = a
a = b
b = t
return a
# # 求两个数字的最小公倍数
def comultiple_2(a, b):
c = a * b
mincomult = c / cofactor_2(a, b)
return mincomult
# # 求多个数字的最小公倍数
def comultiple_mul(shuzu):
a = shuzu[0]
b = shuzu[1]
index = 1
for i in range(len(shuzu)-1):
a = comultiple_2(a, b)
if index < len(shuzu) - 1:
index += 1
b = shuzu[index]
else:
pass
return a
if __name__ == '__main__':
shuzu = [i for i in range(1, 21, 1)]
# print(shuzu)
x = comultiple_mul(shuzu)
print(x)