欧几里得算法(辗转相除法)求最大公约数

欧几里得算法求最大公约数

Sometimes your whole life boils down to one insane move.
人这一辈子,有时就得靠一次疯狂的举动才能扭转乾坤。
------------------《阿凡达》

一、介绍欧几里得


  像所有博客一样,出于尊重,介绍一下这位伟大的数学家欧几里得。

  欧几里得,古希腊人,数学家,主要成就:数学巨著《几何原本》、欧几里得算法、完全数。

  在柏拉图学派晚期导师普罗克洛斯(约410~485)的《几何学发展概要》中,就记载着这样一则故事,说的是数学在欧几里得的推动下,逐渐成为人们生活中的一个时髦话题(这与当今社会截然相反),以至于当时亚里山大国王托勒密一世也想赶这一时髦,学点儿几何学。

  虽然这位国王见多识广,但欧氏几何却令他学的很吃力。于是,他问欧几里得“学习几何学有没有什么捷径可走?”,欧几里得笑道:“抱歉,陛下!学习数学和学习一切科学一样,是没有什么捷径可走的。学习数学,人人都得独立思考,就像种庄稼一样,不耕耘是不会有收获的。在这一方面,国王和普通老百姓是一样的。” 从此,“在几何学里,没有专为国王铺设的大道。”这句话成为千古传诵的学习箴言。
  总之呢,任何事情都是这样,哪有这么多得捷径可走,天才往往都是天天积累成才。

二、实现思路


定义2.1:设m和n是两个不全为0的整数,称m与n的公因子中最大的为m与n的最大公因子,或最大公约数(greatest common divisor),记作gcd(m,n)
定义2.2:设m和n是两个非零整数,称a与b最小的公倍数为m与n的最小公倍数(least common multiple),记作lcm(m,n)


欧几里得算法又称辗转相除法
s:设两个正整数m,n且m > n ;
s1:令r=m%n(%代表取余);
s2:若r=0(即n整除m)运算结束,n为结果 ;
s3:否则令m=n,n=r并返回s1 ;

三、核心思想

gcd(m,n)=gcd(n,mod(m,n)
lcm(m,n) = ab/gcd(m,n)

证明:不妨设 m=k1d ,n=k2d , k3 = m/n (整除) 则 r=m-k3n=k1d-k2k3d=(k1- k2k3)d
故r也是d的倍数,得证 g c d ( m , n ) = g c d ( n , m o d ( m , n ) g c d ( m , n ) = g c d ( n , m o d ( m , n ) g c d ( m , n ) = g c d ( n , m o d ( m , n ) gcd(m,n)=gcd(n,mod(m,n)gcd(m,n)=gcd(n,mod(m,n) \it gcd (m,n)=gcd(n,mod(m,n) gcd(m,n)=gcd(n,mod(m,n)

四、优点

一看相比于穷举法,效率也会高很多

五、核心代码

int gcd(int m,int n)
{
	int t,r;
	if(m<n)
	swap(m,n); //交换二者的值
	while(n!=0)
	{
		r=m%n;
		m=n;
		n=r;
	}
	return m;
}
int gcd(int m,int n) // 递归做法
{
	if(m<n)
	swap(m,n); //交换二者的值
	if(n==0) return m; 
	return gcd(n,m%n);
}
int lcm(int gcd,int m,int n)
{
	return m/gcd*n;
}

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

参考来源:人物简介源自百度百科

在CSDN上的第一篇文章,2019加油!

发布了34 篇原创文章 · 获赞 1 · 访问量 2596

猜你喜欢

转载自blog.csdn.net/qq_39685968/article/details/101941159