求两个数的最大公约数

设有a,b两个数,且a>b,求a,b的最大公约数

假如a%b=0,则说明b就是两个数的最大公约数。

假如a%b=r(r不为0),则说明b不是两数的最大公约数,此时,要么两数不存在最大公约数,要么最大公约数小于b。

当最大公约数m存在且小于b时,则最大公约数一定小于r,即有m<r<b<a 设a/b=k…r,因为m是a,b的最大公约数,故设a=xm,b=ym,则r=a-bk=(x-by)*m,即说明余数r也是m的倍数,即说明a,b的最大公约数和a,b,r三个数的最大公约数是一样的,所以求a,b的最大公约数等价于求b,r的最大公约数。 此时,再把b的值赋给a,r的值再赋给b…………往复循环以上步骤,b的值就会不断的减小,直到a%b=0,那么此时b的值就是最大公约数。

特别地,如果a,b不存在最大公约数,那么最后b的值会等于1,因为任何数取模1其结果都是0,而此时a的值是不确定的。

    //a,b取模结果不为0就一直循环
    //当a<b时,第一次循环会交换a,b的位置
    while(a%b)
      {
          //取模获得a,b的余数r
          int r=a%b;
          //把b赋值给a
          a=b;
          //把r的值赋值给b,准备下一轮循环
          b=r;                         
      }