求最大公约数的三种方法

一。最大公约数:是能够整除两个整数的最大整数,如下三种方法:

/*1.穷举法
 
 
由于a和b的最大公约数不可能比两者的较小者还大,即检查从1~t的所有整数,满足公约数条件的t就是最大公约数。*/
#include <stdio.h>#include <stdlib.h>int Gcd(int a,int b){ int t; if( a<=0 ||b<=0 ) return -1; t=a<b?a:b; for(int i=t;i>0;i--){ //从a和b的较小者t开始,逐次减1尝试每种可能 if(a%i==0&&b%i==0) return i; } return 1;}int main(){ int a,b,c; scanf("%d%d",&a,&b); c = Gcd(a,b); if(c!=-1) printf("%d和%d的最大公约数为%d\n",a,b,c); else printf("%d和%d无最大公约数!",a,b); return 0;}
/*2.欧几里得算法或辗转相除法
    对正整数a,b进行连续的求余运算,直到余数为0为止,此时非0的除数就是最大公约数。
    即Gcd(a,b)=Gcd(b,r)
    例如50和15的最大公约数Gcd(50,15)=Gcd(15,5)=Gcd(5,0)
*/
#include <stdio.h>
#include <stdlib.h>

int Gcd(int a,int b){
    int r;
    if( a<=0 ||b<=0 ) return -1;
    do{
        r = a % b;
        a = b;
        b = r;
    }while(r!=0);
    return a;
}
int main()
{
    int a,b,c;
    scanf("%d%d",&a,&b);
    c = Gcd(a,b);
    if(c!=-1) printf("%d和%d的最大公约数为%d\n",a,b,c);
    else printf("%d和%d无最大公约数!",a,b);
    return 0;
}

/*3.递归
    当a>b时,若a中含有与b相同的最大公约数,那么a-b中也有与b相同的最大公约数。
    直到a=b为止,此时a或b就是最大公约数。
*/
#include <stdio.h>
#include <stdlib.h>

int Gcd(int a,int b){
    if( a<=0 ||b<=0 ) return -1;
    if(a==b) return a;
    else if(a>b) return Gcd(a-b,b);
    else return Gcd(b,b-a);
}
int main()
{
    int a,b,c;
    scanf("%d%d",&a,&b);
    c = Gcd(a,b);
    if(c!=-1) printf("%d和%d的最大公约数为%d\n",a,b,c);
    else printf("%d和%d无最大公约数!",a,b);
    return 0;
}




猜你喜欢

转载自blog.csdn.net/RRWJ__/article/details/80039065