問題
2520は、1から10までの各数で除算できる余りのない最小の数です。
1から20までのすべての数で割り切れる最小の正の数はいくつですか?
2520は1〜10のすべての数で割り切れる数です。1〜20のすべての数で割り切れる正の最小数はいくつですか。
アイデア
-
問題は本質的に1〜20の最小公倍数を解決することです。2つの数値の最小公倍数を最初に見つけ、次にそれを複数の数値の最小公倍数に展開できます。
-
2つの数値の最小公倍数の法則* 2つの数値の最大公約数= 2つの数値の積、2つの数値の最小公倍数を解く必要があります。最初に2つの数値の最大公約数を解くことができます。
-
最大の共通要因は、トスと減算の方法を使用して解決できます。
投げて引く
2つの数値が同じになるまで、大きい数値から小さい数値を減算します。同じ数値が2つの数値の最大の共通因子です。
例:(35、28)の最大の共通因子を解く
(35、28)では35が大きく、35を使用して28を減算します
->(7、28)、28の方が大きい、28を使用して7を引く
->(7、21)、21の方が大きい、21を使用して7を引く
->(7、14)、14の方が大きい、14を使用して7を引く
->(7,7)、2つの数値は同じです。つまり、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)