自然语言描述
用辗转相除法确定两个正整数 a 和 b(a≥b) 的最大公因数gcd(a,b):
当a mod b=0 时gcd(a,b)=b,否则
gcd(a,b) = gcd(b,a mod b)
递归或循环运算得出结果
伪代码
这个算法可以用递归写成如下:
function gcd(a,b) {
if b<>0
return gcd(b,a mod b);
else
return a;
}
gcd 简易函数
c语言辗转相除代码:
int GCD(int a,int b)
{returnb==0?a:GCD(b,a%b);}
C++语言实现
#include<iostream>
using namespace std;
int a , b , a1 , b2 , l;
int gcd(int x , int y)
{
if(!y)
return x;
else return gcd(y , x%y);
}
int main()
{
std::cout << "请输入两个正整数,计算它们的最大公约数" << endl ;
int a , b , ans;
std::cin >> a >> b;
if(a > b)
ans = gcd(a , b);
else ans = gcd(b , a);
cout << ans;
return 0;
}
C语言实现
/*题目:输入两个正整数,求其最大公约数。*/
#include <stdio.h>
unsigned gcd ( unsigned,unsigned ) ;
int main( void )
{
unsigned m,n;
printf("请输入两个正整数:");
scanf("%u%u",&m,&n);
printf("%u与%u的最大公约数为:%u\n",m,n,gcd ( m,n ) );
return 0;
}
/* 功能:返回正整数m和n的最大公约数*/
unsigned gcd ( unsigned m,unsigned n )
{
unsigned temp;
if (m<n)
{
temp=m;
m=n;
n=temp;
}
if ( m % n == 0)
{
return n;
}
else
{
return gcd ( n,m % n) ;
}
}
/*题目:输入两个非负整数u和v,求其最大公约数。*/
#include <stdio.h> main() { int u,v,r; printf("please input u and v:"); scanf("%d,%d",&u,&v); while(v!=0) { r=u%v; u=v; v=r; } printf("%d\n",u); }
C#语言实现
static int sucDivison/*除法*/(int m, int n) { int remainder = 0; if (m % n == 0) { return n; } else { do { remainder = m % n; m = n; n = remainder; } while (remainder > 0); } if (n == 0) { return m; } return n; }
Basic实现
INPUT m,n
DO
r=m MOD n
m=n
n=r
LOOP UNTIL r=0
PRINT m
END
Pascal实现
function gcd(a,b:integer):integer;
begin
if b=0 then gcd:=a
else gcd:=gcd (b,a mod b);
end ;
Common Lisp实现
(defun my-gcd (number-a number-b)
(do ((r (mod number-a number-b) (mod ea eb))(eb number-b r) (ea number-a eb))
((= 0 r) eb)))
Java 实现
/**
*
* @return int
* @tags @param m
* @tags @param n
* @tags @return
* @todo 【方法二】利用辗除法
*/
public static int gcd(int m, int n) {
while (true) {
if ((m = m % n) == 0)
return n;
if ((n = n % m) == 0)
return m;
}
}
Python实现
#递归解决最大公约数问题
def gcd(x,y):
if y != 0:
return gcd(y,x%y)
else:
return x
x = int(input('请输入第一个数字:'))
y = int(input('请输入第二个数字:'))
print('%d 和 %d 的最大公约数为:' %(x,y),gcd(x,y))
数据举例
其中“a mod b”是指取 a ÷ b 的余数。
例如,123456 和 7890 的最大公因子是 6,这可由下列步骤看出: a b a mod b 123456 7890 5106 7890 5106 2784 5106 2784 2322 2784 2322 462 2322 462 12 462 12 6 12 6 0 时间复杂度
辗转相除法的运算速度为 O(n),其中 n 为输入数值的位数。
辗转相除法处理大数时非常高效,它需要的步骤不会超过较小数的位数(十进制下)的五倍。加百利·拉梅(GabrielLamé)于1844年证明了这点,开创了计算复杂性理论。
辗转相除法是什么?
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数...
辗转相除法一般指的是什么算法?
辗转相除法一般指欧几里得算法。欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。那么辗转相除法的原理是什么?1、 原理:设两数为a、b(ab),用gcd(a,b)表示a,b的最大公约数,r=a(mod b)为a除以b的余数,k为a除以b的商,即a÷b=k。。。r。辗转相除法即是要...
辗转相除法推导过程
辗转相除法,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法,其可追溯至公元前300年前。来源:设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q...r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用...
辗转相除法证明
辗转相除法,或称欧几里得算法,是一种求解两个正整数a和b(a>b)最大公约数(记为gcd(a, b))的有效方法。其基本步骤如下:首先,用b除以a,得到商q和余数r1(0≤r1<a),即a = bq + r1。若r1为0,说明b就是最大公约数,即gcd(a, b) = b;若r1不为0,继续用b除以r1,得到新的...
辗转相除法除到余数为0为止。
辗转相除法除到余数为0为止。具体而言,从定义上可知,欧几里德算法,也称辗转相除法。其基本思想是:对正整数a和b,连续进行求余运算,直到余数为0为止,此时非0的除数就是最大公约数。所以辗转相除法是一个比较重要的基础算法。辗转相除法计算例子:假如需要求 1997 和 615 两个正整数的最大公约数...
辗转相除法的算法步骤
辗转相除法的算法步骤为,两个数中用较大数除以较小数,再用出现的余数(第一余数)去除除数。再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。得到最后的除数是这两个数的最大公约数。
辗转相除法原理证明
辗转相除法是求两个数的最大公约数的方法。如果求几个数的最大公约数,可以先求两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数。这样依次下去,直到最后一个数为止。最后所得的一个最大公约数,就是所求的几个数的最大公约数。辗转相除法,是由欧几里德算法而来。其基本原理...
欧几里得算法(辗转相除算法)
探索欧几里得算法:辗转相除的奥秘 欧几里得算法,又名辗转相除法,是一把解开数学世界里求最大公约数的神奇钥匙。这个古老的算法,源自古希腊数学家欧几里得的智慧结晶,他在著作《几何原本》中首次揭示了这一经典概念。想象一下,如果你手中握有两条线段a和b,它们的长度不一,但你渴望找到一个共同的...
什么是辗转相除法?
[编辑] 算法 辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:1. 若 r 是 a ÷ b 的余数, 则 gcd(a,b) = gcd(b,r)2. a 和其倍数之最大公因子为 a。另一种写法是:1. a ÷ b,令r为所得余数(0≤r<b)若 r = 0,算法结束;b 即为答案。2. 互换:...
辗转相除辗转相除法的算法
辗转相除法是一种寻找两个正整数最大公因数的算法。其核心原理基于以下两点性质:首先,若将较大数除以较小数得到的余数记为r,则两数的最大公因数等于较小数与余数的最大公因数,即gcd(a,b) = gcd(b,r)。其次,任何正整数与其倍数的最大公因数即为该正整数本身。算法执行过程如下:1. 对于两...