ヒント:練習問題_3_14(最大公約数② 素因数分解を参考に)
解答例は練習問題_3_8の素因数分解 試し割り法を参考とし、割り切れるかどうか確認する内側のループ処理をfor if break elseで、公約数の回数だけ回す外側のループ処理にはwhile文を使用しています。
timeモジュールやカウンターの設定は前問①と同じですので、以下は練習問題_3_8との違いをメインに記載します。
- 内側のfor文のシーケンスには range(x_start, min(a, b) + 1) を使います。そしてx_startの初期値は2です。この初期値を1とするとx_startは1が継続使用されてwhile文が無限ループになります。この辺はコードを書いてる途中で気付くことが多いです。最大公約数(g)は共通の約数の掛け算ですので初期値は1です。したがってa, bに異なる素数が入力された場合は、この初期値の1が結果として出力されます。
- 内側のfor文のシーケンス range(x_start, min(a, b) + 1) の min(a, b) + 1 は前問①と同じく a = nb (nは自然数) の場合 a を最大公約数(g)として出力する必要があるためです。
- 判定のif文の条件は前問①と同様、処理文は練習問題_3_8と同様にaとbはxで割り算したもの、x_startにはxを代入します。また g *= x を追加する必要があります。