こんにちは。最近Pythonの勉強を始めて、Pythonのお勉強 問題集というサイトの問題を解いているのですが、知識の整理を兼ねてアウトプットしたいと思います。
今回は、N個の整数の最小公倍数・最大公約数を求める問題です。ちなみに初投稿です。
#2整数の最大公約数を求める
Pythonのお勉強 問題集では二つの数字の最大公約数をユークリッドの互除法を用いて解け、とあるのでまずそちらから。
def euclid(a, b):
while b:
a, b = b, a%b
return a
###再帰関数を使う(追記 2019/06/13)
再帰関数を用いた方がいいというコメントを頂いたので書いてみます。
def euclid(a, b):
if b == 0:
return a
else:
return euclid(b, a%b)
#N個の整数の最大公約数を求める
やや応用としてN個の整数の最大公約数を求めてみたいと思います。
###functools.reduceを使う(追記 2019/06/13)
functools.reduceを使うと便利というコメントを頂いたので使ってみます。
import functools
def gcd(nums):
return functools.reduce(euclid, nums)
num = list(map(int, input().split()))
print(gcd(num))
このモジュールを利用することで、例えばnum = [1, 2, 3, 4]において、euclidの引数を(((1,2),3),4)といったようにして順に関数を実行することができます。
#2整数の最小公倍数を求める
最小公倍数は2整数を掛けた値を2整数の最大公約数で割ればいいので
def multiple(a, b):
return a*b // euclid(a, b)
#N個の整数の最小公倍数を求める
N個の整数の最大公約数のときと同様にfunctools.reduceを使って書いてみます。
import functools
def lcm(nums):
return functools.reduce(multiple, nums)
num = list(map(int, input().split()))
print(lcm(num))
#おわりに
引数を一つ前の実行結果に依存した繰り返し処理を実行したいときにfunctools.reduceがとても便利ですね。
コメントありがとうございます。