プロジェクトオイラー質問5最小倍数

問題

2520は、1から10までの各数で除算できる余りのない最小の数です。

1から20までのすべての数で割り切れる最小の正の数はいくつですか?

2520は1〜10のすべての数で割り切れる数です。1〜20のすべての数で割り切れる正の最小数はいくつですか。

アイデア

  1. 問題は本質的に1〜20の最小公倍数を解決することです。2つの数値の最小公倍数を最初に見つけ、次にそれを複数の数値の最小公倍数に展開できます。

  2. 2つの数値の最小公倍数の法則* 2つの数値の最大公約数= 2つの数値の積、2つの数値の最小公倍数を解く必要があります。最初に2つの数値の最大公約数を解くことができます。

  3. 最大の共通要因は、トスと減算の方法を使用して解決できます。

投げて引く

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)

 

おすすめ

転載: blog.csdn.net/weixin_41297561/article/details/108629973