问题 B: 求最大公约数

原创 2015年07月10日 09:47:36

题目描述

求两个正整数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.
版权声明:本文为博主原创文章,未经博主允许不得转载。

gcd(a,b),求两个数最大公约数

  • 2011年03月30日 00:18
  • 28KB
  • 下载

1.将数组A中的内容和数组B中的内容进行交换。(数组一样大) 2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。 3.将三个数按从大到小输出。 4.求两个数的最大公约数。

#define _CRT_SECURE_NO_WARNINGS 1 #include #include //1.将数组A中的内容和数组B中的内容进行交换。(数组一样大) //void swap...

C++求最小公倍数和最大公约数问题

这道题的解答就是求三个数(假设为想x,y,z)的最小公倍数,通过转化,这个最小公倍数可以转化成x*y*z÷最大公约数(x,y)÷最大公约数(x*y,z);所以问题的解答编程了如何求最大公约数的问题上了...

求最大公约数问题

今天看了编程之美中的求解最大公约

【C++解题报告】求最大公约数问题(辗转相除法)

题目来源:     基础班《函数、递推、递归》,递归第5题。     北大OJ-NOI 2.2基本算法之递归和自调用函数  7592 描述:          总时间限制:1000ms  内存...

《编程之美》求两个大整数的最大公约数问题的一般解法

#include #include #define MAX 100 #define c 1       /*这是控制程序调试用的代码,当c=0时可以注释代码*/ #if c char *big2S...

求最小公倍数跟最大公约数问题

求最大公约数(辗转相除法)   设a=qb+r,其中,a,b,q,r都是整数,则 gcd(a,b)=gcd(b,r) int gcd(int a, int b) {     int x,y,r; ...

两个类A和B,A创建的对象可以计算两个整数的最大公约数,B创建的对象可以求最好公倍数,B类中成员变量是A类声明对象

package com.lst;import java.util.Scanner;public class Number { public static void main(String[] a...

【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。(辗转相除法和常规求法)

/*编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。 例如:输入传入(0 , 5)函数返回5,传入(10 , 9)函数返回1,传入(12 , 4)函数返回4 */ #includ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:问题 B: 求最大公约数
举报原因:
原因补充:

(最多只允许输入30个字)