「辗转相除法」和「更相减损术」求最大公约数
一、辗转相除法
举个例子,比如155和65
155=65*2+25
65=25*2+15
25=15*1+10
15=10*1+5
10=5*2+0
一直除到余数为0为止,所以最大公约数是5
public int gcd1(int a, int b) {int l = Math.max(a, b);int s = Math.min(a, b);while (s != 0) {int r = l % s;l = s;s = r;}return l;}
辗转相除法的最大问题在于,"%"这个操作因为是除法比较耗时,尤其是当l和s比较大的时候,会造成性能下降。
二、更相减损术
还是155和65
155-65=90
90-65=25
65-25=40
40-25=15
25-15=10
15-10=5
10-5=5
一直减到被减数和差相等为止,所以最大公约数是5
public int gcd2(int a, int b) {int l = Math.max(a, b);int s = Math.min(a, b);int r = l - s;while (s != r) {l = Math.max(s, r);s = Math.min(s, r);r = l - s;}return r;}
更相减损术的问题是遇到差别很大的数据,比如99999和1的时候要互减99998次,这样显然不行,所以我们做一个改进,把上面两个方法的优势结合起来。
三、两种方法的结合
结合的规律是这样的:
1.如果a、b都是偶数,则最大公约数gcd(a,b)=2∗gcd(a2,b2)gcd(a,b)=2*gcd(\frac{a}{2},\frac{b}{2})gcd(a,b)=2∗gcd(2a,2b)
比如gcd(100,50)=50=2*gcd(50,25)=2*25=50
2.如果a、b一个是偶数一个是奇数,则最大公约数gcd(a,b)=gcd(a2,b)gcd(a,b)=gcd(\frac{a}{2},{b})gcd(a,b)=gcd(2a,b)[这里假定a是偶数]
比如gcd(100,25)=25=gcd(50,25)=25
3.如果a、b都是奇数,则执行一次更相减损术,将其转化为1、2两种状态
比如a,b分别是49和21,执行一次相减,49-21=28,那a,b就变成了28和21,这就回到了状态2
注意每一次变换完都要减一下看看是不是已经结束了。
——————————————————————————————————
举个例子:
a=67870,b=23446,multi=1
a-b=44424!=b
a、b都是偶数,执行状态1,则a=33935,b=11723,multi=2
(因为都是偶数时要把2提出来,我们把这个倍数赋给multi,最后记得乘回来就行)
a-b=22212!=b
a、b都是奇数,执行状态3,则a=22212,b=11723
a-b=10489!=b
a是偶数,b是奇数,执行状态2,则a=11106,b=11723,交换一下让a是较大数,a=11723,b=11106
a-b=617!=b
a是奇数,b是偶数,执行状态2,则a=11723,b=5553
a-b=6170!=b
a、b都是奇数,执行状态3,则a=6170,b=5553
a-b=617!=b
a是偶数,b是奇数,执行状态2,则a=5553,b=3085
a-b=2468!=b
a、b都是奇数,执行状态3,则a=3085,b=2468
a-b=617!=b
a是奇数,b是偶数,执行状态2,则a=3085,b=1234
a-b=1851!=b
a是奇数,b是偶数,执行状态2,则a=3085,b=617
a-b=2468!=b
a、b都是奇数,执行状态3,则a=2468,b=617
a-b=1851!=b
a是偶数,b是奇数,执行状态2,则a=1234,b=617
a-b=617==b
所以最大公约数是617*multi=1234
———————————————————————————————————
public int gcd3(int a, int b) {int l = Math.max(a, b);int s = Math.min(a, b);int r = l - s;int multi = 1;while (s != r) {if ((l & 1) == 0 && (s & 1) == 0) {l = l >> 1;s = s >> 1;multi <<= 1;} else if ((l & 1) == 0 && (s & 1) != 0) {l = l >> 1;if (l < s) {int p = l;l = s;s = p;}} else if ((l & 1) != 0 && (s & 1) == 0) {s = s >> 1;} else {l = Math.max(s, r);s = Math.min(s, r);}r = l - s;}return r * multi;
}
「辗转相除法」和「更相减损术」求最大公约数相关推荐
- 辗转相除法与更相减损术(求最大公约数)
辗转相除法:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数.比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数. ...
- 更相减损法java代码_Python基于更相减损术实现求解最大公约数的方法
本文实例讲述了Python基于更相减损术实现求解最大公约数的方法.分享给大家供大家参考,具体如下: 先从网上摘录一段算法的描述如下: 更相减损法:也叫 更相减损术,是出自< 九章算术>的一 ...
- 更相减损法(求最大公约数)
算法本质: 第一步:任意给定两个正整数:判断它们是否都是偶数.若是,则用2约简:若不是则执行第二步.第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数.继续这个操作,直到所得的 ...
- C++算法:辗转相除法与更相减损术
辗转相除法与更相减损术 1.我们已经学过求最大公因数的知识,你能求出18与30的公因数吗? 2.如果公因数比较大而且根据我们的观察又不能得到一些公因数,我们又应该怎样求它们的最大公因数?比如求8251 ...
- c语言碾转相除法,从高中碾转相除法、更相减损术算法谈起
编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾经见过不少的算法题,发现有的并不在数据 ...
- 更相减损法java,五十六、从高中碾转相除法、更相减损术算法谈起
「@Author:Runsen」❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」❞ 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾 ...
- 更相减损法java,五十6、从高中碾转相除法、更相减损术算法谈起
「@Author:Runsen」git ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」github ❞ 先问大家一个小学问题:「如何求两个整 ...
- 更相减损术程序设计c语言,更相减损术
本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合 ...
- C语言 用更相减损术求最大公约数,最小公倍数
更相减损术 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. 出处 <九章算术> 用途 求最大公约数 作用 ...
最新文章
- mysql和jdbc的区别_JDBC详解
- TCP超时与重传机制与拥塞避免
- 可以直接用的“ html转字符串string”方法
- Spring笔记——2.使用Spring容器
- CountDownLatch 初识
- Kaggle问题总结1
- SpringMVC的数据响应
- 【jQuery实例】Ajax登录页面
- 如何编程实现iAMT无线功能的禁用和开启
- shell判断字符串为空
- linux mpeg4ip 编译,利用Linux实现MPEG4流媒体技术
- 《多媒体在初中数学中的运用研究》课题研究报告
- 解决 Please use the NLTK Downloader to obtain the resource
- 微信小程序-各种跳转
- 女性游戏市场崛起,B站能否能否抓住风口打造下一个FGO?
- 短网址还原 php,php简单实现短网址(短链)还原的方法(测试可用),php还原_PHP教程...
- ASIHTTPRequest类库的简单介绍
- 自制python图片下载器
- MSM搭建(Memcached_Session_Manager)--解决集群session共享
- opencv android 透视,Opencv for Android 之透视变换