最大公约数与扩展欧几里得算法

时间:2023-01-09 09:46:16

一、朴素递归算法

int zuidagongyueshu(int m, int n) {
    if (n == 0) {
        return m;
    }
    return zuidagongyueshu(n, m % n);
} 

 

二、迭代算法

int zuidagongyueshu2(int m, int n) {
    while (n!=0) {
        int tmp=m%n;
        m=n;
        n=tmp;
    }
    return m;
}

三、扩展欧式算法

void exEuclid(int a, int b, int&x, int&y) {
    if (b==0) {
        if (a!=1) {
            puts("Mei you jie la QwQ");
        }
        x=1;
        y=0;
        return;
    }//据说不停的算b总会有一天到0 
    int k=a/b,c=a%b;
    exEuclid(b,c,x,y);
    int xp=x,yp=y;
    x=yp;
    y=xp-k*yp;
}
/*
类比辗转相除法 不停地迭代 
a = kb + d
(kb + d)x + by = c
b(kx + y) + dx = c 
*/