求告知求最大公约数提交为啥答案错误


#include<stdio.h>
int gcd(int x,int y){
    if(y==0)
        return x;
    else
        return (y,x%y);
}
int main(){
    int a,b,c;
    scanf("%d %d",&a,&b);
    if(a>b){
        c=a;
        a=b;
        b=c;
    }
    printf("%d\n",gcd(a,b));
    return 0;
}

修改见注释,供参考:

#include<stdio.h>
int gcd(int x,int y){
    if(y==0)
        return x;
    else
        return gcd(y,x%y); //修改
}
int main(){
    int a,b,c;
    scanf("%d %d",&a,&b);
    if(a<b){              //修改
        c=a;
        a=b;
        b=c;
    }
    printf("%d\n",gcd(a,b));
    return 0;
}

if(a>b){
改为
if(a<b){
大小弄反了

应该采用递归的形式,gcd返回值是gcd(y, x%y)

求公约数的方法错了,改成下面这样:

#include<stdio.h>
int gcd(int x,int y){
    for(int i=x;i>0;i--)
    {
        if(x%i==0&&y%i==0){
            return i;
        }
    }
}
int main(){
    int a,b,c;
    scanf("%d %d",&a,&b);
    if(a>b){
        c=a;
        a=b;
        b=c;
    }
    printf("%d\n",gcd(a,b));
    return 0;
}


因为辗转相除法是小数除大数

img

if(a>b)改为 if(a<b)即可。
scanf("%d %d",&a,&b);其实也建议改一下,改成scanf("%d%d",&a,&b);
如果不改,就会每次输入a之后必须要输入一个空格才能正常输入b
希望对题主有所帮助,望采纳!!