每天一道编程题----------------辗转相除法求两个数的最大公约数及其证明

来源:互联网 发布:arp绑定mac地质作用 编辑:程序博客网 时间:2024/05/16 01:16

    证明方法为转载:

       设两数为a、b(a>b),b最大公约数(a,b)的步骤如下:用b除a,得a=bq......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q......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以后的余数,辗转相除法即是要证明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)。

  证毕。

一下代码为原创编写,如有更好地意见,请大家提出...........

要求两个数的最小公倍数只要将两个数相乘再除以最大公约数即为最小公倍数。

public class ContinuousDivision {public static int continuousdivision(int a, int b) {if (a < b) {int temp = a;a = b;b = temp;}    if (a % b != 0) {int r = a % b;return continuousdivision(b, r);}else{return b;}}     public static void main(String[] args) {System.out.println("两个数的最大公约数为:"+continuousdivision(55, 99));                System.out.println("两个数的最小公倍数为:"+(55*99)/continuousdivision);}}