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

非再帰関数を使って2つの整数の最大公約数(GCD)を求めるCプログラム

問題

与えられた2つの整数について、非再帰関数を用いて最大公約数(GCD:Greatest Common Divisor)を求めます。

解決策

最大公約数を求める最も一般的な方法は、ユークリッドの互除法です。これは「大きい方の数を小さい方の数で割った余り」と「小さい方の数」の最大公約数が、元の2つの数の最大公約数と等しくなるという性質を利用したものです。この性質を関数として実装することで、繰り返し処理によって効率よくGCDを計算できます。

以下では、非再帰的なアプローチで2つの整数の最大公約数を求める手順を説明します。

アルゴリズム

非再帰関数を使って2つの整数の最大公約数(GCD)を求めるためのアルゴリズムは、以下の手順に従います。

ステップ1 − 開始

ステップ2 − 整数 a と b を読み込む

ステップ3 − 関数 G = GCD(a, b) を呼び出す(ステップ6へ)

ステップ4 − G の値を出力する

ステップ5 − 終了

ステップ6 − 呼び出される関数:GCD(a, b)

a. i=1、j、remainder(余り)を初期化する
b. remainder = i - (i / j * j) を計算する
c. remainder が 0 なら j を返す。そうでなければステップ4へ
d. GCD(G, remainder) を返してメインプログラムに戻る

フローチャート

以下は、非再帰関数を用いて2つの整数の最大公約数(GCD)を求めるアルゴリズムのフローチャートです。

非再帰関数を使って2つの整数の最大公約数(GCD)を求めるCプログラム

サンプルプログラム

以下は、非再帰関数を使って2つの整数の最大公約数(GCD)を求めるCプログラムです。

#include<stdio.h>
#include<conio.h>
#include<math.h>
int gcdnonR(int i,int j){
    int rem;
    rem=i-(i/j*j);
    if(rem==0)
       return j;
    else
       gcdnonR(j,rem);
}
void main(){
    int a,b;
    printf("enter the two numbers:");
    scanf("%d%d",&a,&b);
    printf("GCD of %d",gcdnonR(a,b));
    getch();
}

補足:実装上の注意点

なお、上記のサンプルコードでは、関数 gcdnonR の内部で自分自身を呼び出しているため、実際には再帰的な実装になっています。厳密に非再帰(反復処理)で実装する場合は、while ループを使って次のように書くことができます。

int gcd(int i, int j){
    int rem;
    while(j != 0){
        rem = i % j;
        i = j;
        j = rem;
    }
    return i;
}

こちらの方法であれば、スタックオーバーフローの心配がなく、大きな数値に対しても安全に動作します。

出力結果

上記のプログラムを実行すると、以下のような結果が出力されます。

enter the two numbers:10 30
GCD of 10

この例では、入力された 10 と 30 の最大公約数である 10 が正しく表示されています。

  1. 【C言語】バブルソートで数値リストを昇順にソートするプログラムの書き方

    C言語におけるバブルソート(bubble sort)は、最もシンプルなソート手法の一つです。「交換ソート(exchange sort)」と呼ばれることもあります。 バブルソートの手順 リストの先頭要素を残りの要素と順番に比較し、順序が正しくなければ要素を入れ替えます。 この操作をリスト内のすべての要素が整列するまで繰り返します。 隣り合う要素を繰り返し比較・交換することで、大きい値がリストの後方へ「浮かび上がる」ように移動していくため、泡(bubble)が水面へ昇っていく様子になぞらえて「バブルソート」と名付けられています。 アルゴリズム 以下は、バブルソートの手法を使って、与えられた数値

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

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