最大公约数的求法


以前写算法题的时候求解最大公约数往往用的是“欧几里得算法”,即辗转相除法:

//c语言
int gcd(int m , int n){
    int r = n;
    n = m % n;
    m = r;
    if(n > 0) m = gcd(m , n);
    return m;
}

 这样的递归写法写起来很是得心应手,我也从来没有想过非递归的写法,今天正好在书上看见了,觉得也很美妙啊:

//c语言
int gcd(int m , int n){
    while(n>0){
        int r = n;
        n = m % n;
        m = r;
    }
    return m;
}

还有蛮力法也不是不行

//c语言
int gcd(int m , int n){ 
    if(m > n){
        for(int i = n; i>=1 ; i--){
            if(m % i == 0 && n % i ==0){
                return i;
            }
        }
    }else {
        for(int i = m; i>=1 ; i--){
            if(m % i == 0 && n % i ==0){
                return i;
            }
        }
    }
}

相关