再帰的ユークリッドの互除法で2つの数の最大公約数(GCD)を求めるC++プログラム
2つの数の最大公約数(GCD:Greatest Common Divisor)とは、その両方を割り切ることができる最大の数のことです。
例として、63と21という2つの数を考えてみましょう。
63 = 7 × 3 × 3 21 = 7 × 3
この場合、63と21に共通する因数は7と3なので、GCDは次のようになります。
GCD = 7 × 3 = 21
再帰的ユークリッドの互除法とは
再帰的ユークリッドの互除法では、正の整数aとbのペアを受け取り、「b」と「a % b(aをbで割った余り)」を引数として自分自身を再帰的に呼び出し、bが0になった時点でaを返すことでGCDを求めます。
このアルゴリズムを使って2つの数のGCDを求めるC++プログラムは以下の通りです。
サンプルコード
#include <iostream>
using namespace std;
int gcd(int a, int b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
int main() {
int a, b;
cout << "Enter the values of a and b: " << endl;
cin >> a >> b;
cout << "GCD of " << a << " and " << b << " is " << gcd(a, b);
return 0;
}実行結果
上記のプログラムを実行すると、次のような出力が得られます。
Enter the values of a and b: 105 30 GCD of 105 and 30 is 15
プログラムの解説
このプログラムの中核となるのが、再帰関数であるgcd()です。この関数はaとbという2つの引数を持ちます。bが0の場合はaをそのままmain()関数に返します。そうでない場合は、bと「a % b」を新しい引数として自分自身を再帰的に呼び出します。
該当するコード部分は以下の通りです。
int gcd(int a, int b) {
if (b == 0)
return a;
return gcd(b, a % b);
}一方、main()関数では、ユーザーからaとbの値を入力してもらい、その後gcd()関数を呼び出して、aとbのGCDの値を画面に表示します。
int main() {
int a, b;
cout << "Enter the values of a and b: " << endl;
cin >> a >> b;
cout << "GCD of " << a << " and " << b << " is " << gcd(a, b);
return 0;
}例えば入力が105と30の場合、gcd(105, 30) → gcd(30, 15) → gcd(15, 0) と再帰が進み、最終的に15が返されます。このように、ユークリッドの互除法は毎回余りを計算することで問題を小さくしていき、効率的にGCDを求めることができるのです。
-
非再帰関数を使って2つの整数の最大公約数(GCD)を求めるCプログラム
問題与えられた2つの整数について、非再帰関数を用いて最大公約数(GCD:Greatest Common Divisor)を求めます。解決策最大公約数を求める最も一般的な方法は、ユークリッドの互除法です。これは「大きい方の数を小さい方の数で割った余り」と「小さい方の数」の最大公約数が、元の2つの数の最大公約数と等しくなるという性質を利用したものです。この性質を関数として実装することで、繰り返し処理によって効率よくGCDを計算できます。以下では、非再帰的なアプローチで2つの整数の最大公約数を求める手順を説明します。アルゴリズム非再帰関数を使って2つの整数の最大公約数(GCD)を求めるためのアルゴリ
-
【C言語】再帰関数を使って2つの整数の最大公約数(GCD)を求める方法
問題 C言語において再帰関数を使用し、与えられた2つの整数の最大公約数(GCD:Greatest Common Divisor)を求めます。 解決策 再帰関数を用いて2つの整数の最大公約数を求めるには、「ユークリッドの互除法」が利用できます。これは「2つの数のGCDは、大きい方の数を小さい方の数で割った余りと、小さい方の数とのGCDに等しい」という性質を応用した手法です。この計算を余りが0になるまで再帰的に繰り返すことで、GCDを効率よく求めることができます。 アルゴリズム 再帰関数を使って2つの整数のGCDを求めるためのアルゴリズムは、以下の手順に従います。 ステップ1 − 再帰関数を