0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

最大公約数と最小公倍数の処理をpythonで書く

Last updated at Posted at 2021-06-18

最大公約数と最小公倍数

ってなんだっけ?
と言う小学生レベルの算数も怪しい私自身に説明するつもりで書く

・最大公約数
24 36とあった時にどっちでも割れる数で一番大きいもの

例えば共通で割れるものとして2, 3, 4, 6, 12とかやっていって
この場合は12が一番大きいので12が答えとなる

大体はすだれ算を使ってやる
こんなやつ↓

2 24 36
2 12 18
3 6 9
2 3

縦に2 * 2 * 3とやれば最大公約数が求められる

・最小公倍数
24 36とあった時どちらも足していって最初に共通の数字が現れたもの
以下の場合は72が共通の数字が現れるので72となる

24 48 72
36 72 108

すだれ算を使ってやった場合は
左と一番下を全て掛け合わせる
2 * 2 * 3 * 2 * 3 = 72

2 24 36
2 12 18
3 6 9
2 3

ここでユークリッド互助法と言うやり方がある
かっこいい名前がついているが方法としては簡単
最大公約数を求める場合はまず2つのうち大きい方を小さい方で割って剰余を求める

36 % 24 = 1 ...12

それを更に小さい方で割ってあまりを求める

24 % 12 = 2 ...0

あまりがゼロになった時点で割った数が最大公約数

次に最小公倍数だがこれはまず2つの数を掛け合わせる

36 * 24 = 864

次に出した積を最大公約数でわる

864 / 12 = 72

このユークリッド互助法を使ってpythonで最大公約数と最小公倍数を求めようとするとこうなった

l = input('Enter two number: ')
l = l.split()
a = max(l, key=int)
b = min(l, key=int)
a, b = int(a), int(b)

def do_gcd(a, b):
    if a == b:
        #return False
        return a
    
    while True:
        if a % b == 0:
            break
        else:
            a, b = b, a % b
    return b

do_gcd(a, b)

c = do_gcd(a, b)
c = int(c)
print("最大公約数" ,c)

def do_lcm(a, b, c):
    return a * b // c

do_lcm(a, b, c)
d = do_lcm(a, b, c)
print("最小公倍数" ,d)
実行結果
Enter two number:  24 36
最大公約数 12
最小公倍数 72

スペース区切りで数字を2つ入れるとそれぞれ結果を返してくれる

ちなみに結構苦労して書いたが、mathを使うと最大公約数をわずか2行で求められることが判明^^;
便利なものはどんどん使っていこうと言う教訓であった

import math
math.gcd(24, 36)
実行結果
12

-20210618 追記
以下のように書けばもっと簡単に書けるよとユーザさんよりご指摘いただく。

修正点① そもそも引数をmaxとminで判定するのは不要
修正点② 2つの引数が同じだった場合の最大公約数はFalseじゃない
修正点③ while Trueで無闇に無限ループ回さなくていいじゃんね

私には絶対思いつかないコードである(苦笑)
(@StrawBerryMoonさん有益な情報ありがとうございます。)

いただいたアドバイスを元に修正したコードは以下の通り

l = input('Enter two number: ')
l = l.split()
a, b = int(l[0]), int(l[1])

def do_gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

do_gcd(a, b)

c = do_gcd(a, b)
c = int(c)
print("最大公約数" ,c)

def do_lcm(a, b, c):
    return a * b // c

do_lcm(a, b, c)
d = do_lcm(a, b, c)
print("最小公倍数" ,d)
0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?