求两个数最大公约数,辗转相除法

215 阅读1分钟

xy 的最大公因数m

思路: (把最大公因数不变的两个数尽量缩小

既然m是他们两个的最大公因数,则m可以整除他们两个,即x是m的倍数,y也是m倍数,

假设x>y,则x-y 等于 m的倍数 - m的倍数,其结果一定能被m整除,

x一直减y,x-y-y-y……,直到余数比y小,称余数为c,c由两个m的倍数相减而来,所以c依旧是m的倍数,且是目前最小的m的倍数,

所以用y和c两个小的数,代替x和y两个大的数,最大公因数是一样的,

而x-y-y-y……减到不能再减,其实就是x÷y,取x内最大倍的y,所以用x%y求c,

如果c为0,则y就是最大公因数,否则一直找两个小的数来计算,直到模为0

下面是代码

1.迭代法:

int gcd(int x, int y)
    {
        int tem, c;
        if(x == 0)
            return y;
        if(y == 0)
            return x;
        if(x < y)       //保证x > y来求余
            {tem = x; x = y; y = tem;}
        c = x % y;
        while(c)        //直到余数 c 为0
        {
            x = y;
            y = c;
            c = x % y;
        }
        return y; 
}
  1. 递归法
int gcd(int x, int y)
    {
        if(y == 0)
            return x;    //上一次余数给了这次的 y,上一次的除数给了这次的 x
        return gcd(y, x%y);    //gcd(小的,余数)
        }
int main(void)
{
    //默认有 x 和 y
    if(x > y)
        Swap(x, y);    //交换两个数
    printf("%d\n", gcd(x, y));
    return 0;
}