C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で再帰を使って最大公約数(GCD)を求めるプログラム

2つの数の最大公約数(GCD:Greatest Common Divisor)とは、その両方の数を割り切ることができる最大の整数のことです。

例として、63と42という2つの数を考えてみましょう。

63 = 7 × 3 × 3
42 = 7 × 3 × 2
したがって、63と42のGCDは 21

このように、共通する約数は「7」と「3」であり、その積である21が最大公約数となります。

ここでは、再帰(リカージョン)を使って2つの数のGCDを求めるC++プログラムを2つの方法で紹介します。

方法1:減算による再帰

1つ目の方法は、大きい方の数から小さい方の数を引く操作を再帰的に繰り返すアプローチです。これはユークリッドの互除法の原理に基づいています。

サンプルコード

#include<iostream>
using namespace std;
int gcd(int a, int b) {
    if (a == 0 || b == 0)
    return 0;
    else if (a == b)
    return a;
    else if (a > b)
    return gcd(a-b, b);
    else return gcd(a, b-a);
}
int main() {
    int a = 63, b = 42;
    cout<<"GCD of "<< a <<" and "<< b <<" is "<< gcd(a, b);
    return 0;
}

出力結果

GCD of 63 and 42 is 21

プログラムの解説

上記のプログラムでは、gcd()が再帰関数として機能しています。この関数は ab の2つの引数を受け取り、以下のようなロジックで動作します。

  • a または b が0の場合 → 関数は0を返します
  • ab が等しい場合 → 関数は a を返します
  • ab より大きい場合 → 引き算した値 (a-b)b を使って自分自身を再帰的に呼び出します
  • ba より大きい場合 → a(b-a) を使って再帰的に呼び出します

該当する部分のコードスニペットは以下の通りです。

int gcd(int a, int b) {
    if (a == 0 || b == 0)
    return 0;
    else if (a == b)
    return a;
    else if (a > b)
    return gcd(a-b, b);
    else return gcd(a, b-a);
}

方法2:剰余演算(%)による再帰

2つ目の方法は、モジュロ演算子(%)を使用するより効率的なアプローチです。こちらもユークリッドの互除法に基づいていますが、減算を繰り返す代わりに剰余を一度に計算するため、処理速度が大幅に向上します。

サンプルコード

#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 = 63, b = 42;
    cout<<"GCD of "<< a <<" and "<< b <<" is "<< gcd(a, b);
    return 0;
}

出力結果

GCD of 63 and 42 is 21

プログラムの解説

このプログラムでも gcd() は再帰関数です。ab の2つの引数を持ち、次のように動作します。

  • b が0になった場合 → 再帰の終了条件となり、a の値がそのまま main() 関数へ返されます
  • b が0でない場合 → ba % b(a を b で割った余り)を新しい引数として、自分自身を再帰的に呼び出します

該当するコードスニペットは以下の通りです。

int gcd(int a, int b) {
    if (b == 0)
    return a;
    return gcd(b, a % b);
}

まとめ

どちらの方法でも同じ結果が得られますが、減算方式は差が大きい場合に再帰呼び出しの回数が増えるのに対し、剰余演算方式は毎回余りを計算するため、より少ないステップで答えにたどり着きます。実務では方法2の剰余演算による再帰が一般的に推奨されます。

  1. 【C言語】再帰関数を使って2つの整数の最大公約数(GCD)を求める方法

    問題 C言語において再帰関数を使用し、与えられた2つの整数の最大公約数(GCD:Greatest Common Divisor)を求めます。 解決策 再帰関数を用いて2つの整数の最大公約数を求めるには、「ユークリッドの互除法」が利用できます。これは「2つの数のGCDは、大きい方の数を小さい方の数で割った余りと、小さい方の数とのGCDに等しい」という性質を応用した手法です。この計算を余りが0になるまで再帰的に繰り返すことで、GCDを効率よく求めることができます。 アルゴリズム 再帰関数を使って2つの整数のGCDを求めるためのアルゴリズムは、以下の手順に従います。 ステップ1 − 再帰関数を

  2. C++で楕円の面積を求めるプログラムの作成方法

    この記事では、C++を使って楕円(だえん)の面積を求める方法を解説します。楕円にはいくつかの重要な構成要素があり、それぞれの意味を理解しておくと計算の仕組みがより明確になります。楕円の主な構成要素要素説明中心楕円の中心点。2つの焦点を結ぶ線分の中点でもあります。長軸楕円における最も長い直径です。短軸楕円における最も短い直径です。弦楕円上の2点を結ぶ線分のことです。焦点楕円を定義する2つの特別な点。図中に示された2点が該当します。通径焦点を通り、長軸に対して垂直な直線(線分)のことです。楕円の面積の公式楕円の面積は、長半径 a と短半径 b を使って次の式で表されます。面積 = π × a ×