*当ブログではアフェリエイト広告を利用しています。

python

【Python】公約数、最大公約数を返すツールを作る!

momeq
モー
モー

今回は、公約数と最大公約数を作るツールを作っていきます。

ニャー
ニャー

最終目標は、コマンドラインから、複数の整数を入力して、その公約数と最大公約数を返すツールを作成することなんだにゃ。方法は色々あると思うけど、イメージしながら挑戦して見て欲しいんだにゃ。

この記事で学べること
  • 公約数と最大公約数について
  • コマンドライン引数のPythonでの受け取り方について
  • Setと集合積の活用方法について

公約数と最大公約数とは?

モー
モー

まずは、公約数と最大公約数について確認しておきましょう。

公約数と最大公約数とは?

公約数 ⇒ 2つ以上の自然数に共通する約数

最大公約数 ⇒ 公約数の中でも最大のもの

例えば・・・

  • 16の約数 ⇒ 1、2、4、8、16
  • 24の約数 ⇒ 1、2、3、4、6、8、12、24

であれば、

  • 16と24の公約数 ⇒ 1、2、4、8
  • 16と24の最大公約数 ⇒ 8

という感じです。

ニャー
ニャー

つまりは、約数を求めて、その共通部分を抜き出せば良いんだにゃ。約数については、別記事で解説して、約数を求めるツールを作っているから確認して欲しいんだにゃ。

【Python】約数を調べたい!整数を入れると約数を返すツールを作成!

約数から公約数と最大公約数を求める

モー
モー

では、実際に公約数と最大公約数を求めます。

約数を求める

def make_divisors(num):
    divisors = [1, num]
    for i in range(2, int(num / 2)+1):
        if num % i == 0:
            divisors.append(i)
            divisors.append(int(num / i))
    divisors = sorted(set(divisors))
    return divisors
d = make_divisors(12)
print(d)
>> [1, 2, 3, 4, 6, 12]
ニャー
ニャー

約数は約数の回で作成したものを引用するにゃ。ルールを意識すれば簡単に作れるんだにゃ。

可変長引数とSetを使って公約数を求める

モー
モー

次に、約数から公約数を求めていきます。公約数は複数の自然数(整数)の共通のものになります。共通を取り出すにはSetの集合積を用いると楽にできますね。

ニャー
ニャー

関数に引数をたくさん渡すことを可変長引数っていうんだにゃ。リスト形式で使用できるので[ ]でそれぞれの要素にアクセスするんだにゃ。forループで順次回せるのも◎だにゃ。

def make_common_divisor(*args):
    if not args:
        return
    divisors_list = set(make_divisors(args[0]))
    for i in args:
        divisors_list &= set(make_divisors(i))
    print("公約数:", sorted(divisors_list))
    print("最大公約数:", max(divisors_list))

make_common_divisor(12, 16)
>> 公約数: [1, 2, 4]
   最大公約数: 4

make_common_divisor(16, 24, 36)
>> 公約数: [1, 2, 4]
   最大公約数: 4
モー
モー

公約数の最大値が最大公約数です。max関数で簡単に求められます。いろいろな関数を使用することで、徐々に慣れていきますよ。

コマンドラインから可変長引数を受け取る

モー
モー

最後に、コマンドライン引数から可変長引数を受け取ります。sys.argvを使用することで、コマンドラインからの引数を受け取りますね。

import sys

def make_divisors(num):
    divisors = [1, num]
    for i in range(2, int(num / 2)+1):
        if num % i == 0:
            divisors.append(i)
            divisors.append(int(num / i))
    divisors = sorted(set(divisors))
    return divisors

def make_common_divisor():
    l = list(map(int, sys.argv[1:]))
    if not l:
        return
    divisors_list = set(make_divisors(l[0]))
    for i in l:
        divisors_list &= set(make_divisors(i))
    print("公約数:", sorted(divisors_list))
    print("最大公約数:", max(divisors_list))

make_common_divisor()

今回は空文字の時だけ関数を抜けるようにしているんだにゃ。でも例えば、文字列が入力された時とか予想外の入力を想定して、エラーを組み合わせると、より高い精度のツールになるからぜひ挑戦して見て欲しいんだにゃ。

ニャー
ニャー

今回は空文字の時だけ関数を抜けるようにしているんだにゃ。でも例えば、文字列が入力された時とか予想外の入力を想定して、エラーを組み合わせると、より高い精度のツールになるからぜひ挑戦して見て欲しいんだにゃ。

プログラミングを学ぶならTechAcademy(テックアカデミー)がおすすめ!

TechAcademy [テックアカデミー]

モー
モー

独学で苦戦している人は、一度しっかりと基礎を学ぶと次のステップへ進めますよ。今のおすすめは、TechAcademy(テックアカデミー)ですね。

TechAcademyのおすすめポイント
  • オンラインで選抜された現役エンジニアから学ぶことができる
  • 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
  • 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている
ニャー
ニャー

無料体験や相談もあるから、一度試してみてもいいんだにゃ!

\無料体験、無料相談はこちらから/



記事URLをコピーしました