欧拉计划 第5题 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-20的最小公倍数,我们可以先求两个数字的最小公倍数,再将其扩展到多个数字的最小公倍数。

  2. 根据 两个数字的最小公倍数 * 两个数字的最大公因数 = 两个数字的乘积 这一规律,要求解两个数字的最小公倍数,我们可以先求解两个数字的最大公因数。

  3. 最大公因数可以使用辗转相减法求解。

辗转相减法

用较大的数字减去较小的数字,直到两个数字相同时,相同数字即为两个数字的最大公因数。

举例:求解(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)

猜你喜欢

转载自blog.csdn.net/weixin_41297561/article/details/108629973