原创 3

2013-9-6 22:33 669 6 6 分类: 软件与OS 文集: C

 

3,求两个正整数的最大公约数和最小公倍数的方法:(比较巧妙)

辗转相除法:

两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 / 105 = 2余42,所以105和42的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如21 = 5 × 105 + (−2) × 252。这个重要的等式叫做贝祖等式。

证明

简单的想法

设两数为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)。

证毕。

C语言实现:

# include <stdio.h>

# include <stdlib.h>

# include <math.h>

int main ()

{

int p,r,n,m,temp;

printf ( "请?输?入?两?个?正y整?数簓,?以?求ó他?们?的?最?大洙?公?约?数簓和í最?小?公?倍?数簓:阰");

scanf  ("%d%d",&m,&n);

if (n<m)

{

temp=n;

n=m;

m=temp;

}

p = n*m;

while  (m !=0)

{

r  = n% m;

n  = m;

m  = r;

}

printf ("他?们?的?最?大洙?公?约?数簓为a:阰%d\n",n);

printf  ("他?们?的?最?小?公?倍?数簓为a:阰%d\n",p/n);

system("pause");

return 0;

}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条