【算法设计与分析笔记】欧几里得算法

欧几里得算法(Euclidean algorithm)

\qquad 欧几里德算法又称辗转相除法,用于计算两个正整数 a a b b 的最大公约数。

计算公式

g c d ( a , b ) = g c d ( b , a   m o d   b ) gcd(a,b)=gcd(b,a\ mod\ b) \qquad 其中 a   m o d   b a\ mod\ b a a 除以 b b 的余数(取余运算),也可以写成 a % b a\%b

证明方法

\qquad 对于任意正整数 a a b b ,都有
a = k b + r            ( k , r N ) a=kb+r \ \ \ \ \ \ \ \ \ \ (k,r\in N) \qquad 所以有
r = a % b r=a\%b \qquad 假设 c c a a b b 的最大公约数,即
c = g c d ( a , b ) c=gcd(a,b) \qquad 所以可得 c a c|a c b c|b | 表示能整除),又因为 r = a k b r=a-kb ,得
c r c|r \qquad 又因为 c b c|b ,可得
c = g c d ( b , r ) c=gcd(b,r) \qquad
g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b)

代码实现

\qquad 迭代方法:

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

\qquad 递归方法:

int gcd(int a,int b)
{
    while(b)
    {
        a = a%b;
        swap(a,b);
    }
    return a;
}

\qquad 两种算法的本质是一样的。

猜你喜欢

转载自blog.csdn.net/qq_22263683/article/details/82829700