0

私はプログラミングが初めてで、学生です。

再帰関数を使用して 2 つの数値の GCD を計算するプログラムを作成しましたが、正しい答えを返すものもあれば、間違った答えを返すものもあります。問題を特定するのを手伝ってください:

#include<stdio.h>
#include<conio.h>

int gcd(int,int,int)

int main(){
    int a,b,x,val;
    printf("Enter the first number: ");
    scanf("%d",&a);
    printf("Enter the second number: ");
    scanf("%d",&b);

    if(a>b)
        x=b;
    else
        x=a;

    val=gcd(a,b,x);
    printf("The GCD of the two numbers you entered is:%d",val);
    getch();
    return 0;
}

int gcd(int a,int b,int x){
    if(a%x==0){
        if (b%x==0)
            return x;
    }else
        return gcd(a,b,x-1);
}

たとえば、最初の数字が 69、2 番目の数字が 65 の場合、プログラムは間違った答えを返しますが、それ以外の場合は不思議なことに正しい答えを返します。

誰かがここで私を助けてくれますか?

4

4 に答える 4

1

コード パスを確認します。すべての条件が gcd 関数で整数を返すわけではありません。どのコンパイラを使用していますか? 警告またはエラーが表示されるはずです。

于 2012-07-11T13:04:30.010 に答える
1

これを試して:

int gcd(int a,int b,int x){
    if(a%x==0 && b%x==0) return x;        
    }else return gcd(a,b,x-1);
}

これは、1 つの if ステートメントで 0 へのモジュラス比較を両方ともキャッチし、この get gcd 呼び出しに該当しないすべての条件をキャッチします。

于 2012-07-11T13:11:38.610 に答える
0

例: と の数a=100を考えてみましょうb=44。100 を割るが 44 ではないに達するx=25と、コードには適切なパスがありません。

すべての条件 (パス) を考慮していません。

int gcd(int a,int b,int x){
    if(a%x==0){
        if (b%x==0)
           return x;
        else
           // ERROR ERROR ERROR, 
           // if the code reaches here, then it neither calls gcd recursively, 
           // nor does it return anything valueable
    }else
        return gcd(a,b,x-1);
}

以下のようにコードを変更する必要があります。

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

また

int gcd(int a,int b,int x){
    if(a%x==0 && b%x==0) return x;        
    return gcd(a,b,x-1);
}
于 2012-07-11T13:35:36.507 に答える