砂場で遊ぼう

c++/python/mathematica などの練習帳

Project Euler 005 / 最小の倍数(Smallest multiple)

問題概略

1 から 20 までのすべての整数で割りきれる最小の自然数を求めよ。

https://projecteuler.net/problem=5

for ループで最小公倍数を計算

答えは 1 から 20 までの数の最小公倍数です。LCM を繰り返しとると解けます。

    from sympy import lcm

    ans = 1
    for i in range(2, 21):
        ans = lcm(ans, i)
    
    print(ans)

reducdeで畳み込み

 \mathrm{LCM}(1, 2)=2\to\mathrm{LCM}\left(\mathrm{LCM}(1, 2), 3\right)=\mathrm{LCM}(2, 3)=6\to \cdots という繰り返しを reduce で書いてみました。

    from sympy import lcm
    from functools import reduce
    
    print(reduce(lambda x, y: lcm(x, y), range(1, 21)))