(模板)最大公约数/最大公约数(数论基础)

本文详细介绍了三种求解最大公约数的方法:枚举、差和判定法及辗转相除法,并通过代码模板展示了辗转相除法的高效实现。同时,阐述了最小公倍数的计算方法,提供了实用的编程示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求两个数的最大公约数,有几种方法。枚举、差和判定法、辗转相除法(也叫欧几里德算法 Euclid algorithm)。

要求: 求a、b的最大公约数 

(最大公约数,也称最大因数、最大公因子,指两个数共有约数中最大的一个)

枚举(为初学者服务,有一定了解可以直接跳过):

       假设a>b  ,设a、b的最约数为x,  显然a,b都能整数x.   即满足a%x==0,b%x==0   

 那么求最大如何求呢? 枚举从a>=k>=1 想想什么?如果满足 a%k==0,b%k==0  此时k就是解。 

差和判定法:

      第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
      第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
     则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
     其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。

(前两种算法只是普及一下)

辗转相除法(也叫欧几里德算法 Euclid algorithm)(主要介绍):

        通过前面的普及,相信大家都明白最大公约数是怎么一回事了吧,现在我们要做的事,寻求一个高效率的方法。

        直接给出模板,然后慢慢体会。这是一个递归算法。

       

<span style="font-size:24px;">int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}</span>


      聪明的同学可能会问,既然是递归,那么免不了问一句,会栈溢出吗?  答案不会。

      可以证明:gcd的递归层数不超过4.785lgN+1.6723 (N=max(a,b))


      搞明白了最大公约数,最小公倍数相当轻松了。lcm(a,b)=a*b/gcd(a,b),想了解更详细的读者可自行查阅资料,这涉及到数学知识了。

<span style="font-size:24px;">int lcm(int a,int b)
{
	return a/gcd(a,b)*b;  //不要写成a*b/gcd(a,b);  	                      
}	// 因为a*b容易溢出  先做除再乘,有时可以避开这一点 </span>


如果满意,就顶一下吧,谢谢啦,互相学习,共同进步。


   


     


            


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值