最大公约数的求法(C语言)

193 阅读1分钟

方法一:循环

//通过从m开始,依次递减,找到同时能被m和n整除的最大数
int gcd(int m, int n)
{
    for(i=m;i>=1;i--) 
    {
        if(m%i==0 && n%i==0) 
        break; 
    }
    return 0;
}

方法二:递归

使用递归是基于欧几里得算法(辗转相除法)的思想,它可以大大减少循环的次数。

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

这个版本的gcd函数递归地调用自身,每次调用时都将较小的数作为新的b,将a除以b的余数作为新的a,直到b为0时返回a作为最大公约数。这种方法效率更高,因为它避免了不必要的迭代,并且利用了整除的性质来快速找到最大公约数。

当然,这个递归的方式可以改成迭代循环,如下:

int gcd(int a,int b)
{
    if(a < b){
        int temp = a;
        a = b;
        b = temp;
    }
    while(b!=0){
        int temp = b;
        b = a % b;
        a = temp;
    }
    return temp;
}