Anonymous 发表于 2014-5-19 09:04:37

C语言求公约数算法,是怎么求出来的?

本帖最后由 匿名 于 2014-5-19 09:43 编辑

int gcd(int v1,int v2)
{
    while(v2)
    {
      int temp = v2;
      v2 = v1 % v2;
      v1 = temp;
    }
    return v1;
}

请一步步说的详细点

sidfate 发表于 2014-5-19 09:04:38

这个算法叫辗转相除法(欧几里得算法),人家欧几里得老头几千年前就得出来的 = =。

简单的想法
设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用b除a,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。其最后一个非零除数即为(a,b)。
原理
设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
证毕。


——来自百度文库

aykuang456 发表于 2014-5-20 15:49:46

受教了,谢谢!
页: [1]
查看完整版本: C语言求公约数算法,是怎么求出来的?