算法学习笔记(1)----最大公约数

求两个整数a,b的最大公约数可用辗转相除法得到,其具体证明如下:假设a>b

  1. 假设a=bt+r,即证明gcd(a,b)=gcd(b,r),设gcd(a,b)=c,a=mc,b=nc

  2. r=a-bt=mc-ntc=(m-nt)c,则只需证明m-nt与n互素

  3. 反证法:假设m-nt与n不互素,则m-nt=xd,n=yd(d>1),则a=mc=(nt+xd)c=(ytd+xd)c=(yt+x)dc,b=nc=ydc,则

    gcd(a,b)=dc,与已知条件相悖,故m-nt与n互素,故gcd(b,r)=c=gcd(a,b)

代码如下:

int gcd(int a, int b)  //a>b
{
    int c;
    do {
        c = a % b;
        a = b;
        b = c;
    }while( c != 0);
    return a;
}


你可能感兴趣的:(算法学习笔记(1)----最大公约数)