欧里几德算法

问题描述

  • 计算两个数字的最大公约数

算法阐述:

  • 求解最大公约数时可以采取辗转相除的方式。
    • 即如果需要求解A,B(A>B)的最大公约数可以采取首先使用A/B=R1...Q1
    • 如果R1=0,则最大公约数为B。
    • 如果R1!=0,则计算B/Q1=R2...Q2
    • 如果R2=0,则最大公约数为Q1
    • 如果R2!=0,则计算Q1/Q2=R2...Q3
    • .......

代码:

//递归方式
int getGCD(int a, int b)
{
    if (a % b == 0)
    {
        return b;
    }    
    return getGCD(b, a % b);
}
//循环方式
int GCD(int A,int B)
{
    int Rem;
    while(B>0)
    {
        Rem = A % B;
        A = B;
        B = Rem;
    }
    return A;
}

时间复杂度

  • 对于该算法来说,运行的时间取决于余数序列的长度,看起来难以判断。
  • 但是根据定理:如果 M > N,则 M mod N < M/2。即每次迭代后,余数最多为原始值得一半,则时间复杂度为O(log N)

猜你喜欢

转载自www.cnblogs.com/cyh-blackhouse/p/12426860.html