关闭

问题 B: 求最大公约数

172人阅读 评论(0) 收藏 举报
分类:

题目描述

求两个正整数m、n的最大公约数。

输入

输入只有一行,为两个正整数m,n(0<m,n<109)。

输出

输出只有一行,为m和n的最大公约数。

样例输入

3 6

样例输出

3

提示


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


证明


设两数为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)。证毕。
var m,n,s:longint;
    i:longint;
begin
 readln(m,n);
  if m>n then s:=m
   else s:=n;
    for i:=s downto 1 do
     if (m mod i=0)and(n mod i=0) then
      begin
       writeln(i);
       break;
      end;
end.

欧几里得:
var a,b,m,n,r:longint;
begin
 readln(a,b);
 m:=a;
 n:=b;
 r:=m mod n;
 while r<>0 do
  begin
   m:=n;
   n:=r;
   r:=m mod n;
  end;
 writeln(n);
end.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14983次
    • 积分:107
    • 等级:
    • 排名:千里之外
    • 原创:91篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档