一、辗转相除法

举个例子,比如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;
}

「辗转相除法」和「更相减损术」求最大公约数相关推荐

  1. 辗转相除法与更相减损术(求最大公约数)

    辗转相除法:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数.比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数. ...

  2. 更相减损法java代码_Python基于更相减损术实现求解最大公约数的方法

    本文实例讲述了Python基于更相减损术实现求解最大公约数的方法.分享给大家供大家参考,具体如下: 先从网上摘录一段算法的描述如下: 更相减损法:也叫 更相减损术,是出自< 九章算术>的一 ...

  3. 更相减损法(求最大公约数)

    算法本质: 第一步:任意给定两个正整数:判断它们是否都是偶数.若是,则用2约简:若不是则执行第二步.第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数.继续这个操作,直到所得的 ...

  4. C++算法:辗转相除法与更相减损术

    辗转相除法与更相减损术 1.我们已经学过求最大公因数的知识,你能求出18与30的公因数吗? 2.如果公因数比较大而且根据我们的观察又不能得到一些公因数,我们又应该怎样求它们的最大公因数?比如求8251 ...

  5. c语言碾转相除法,从高中碾转相除法、更相减损术算法谈起

    编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾经见过不少的算法题,发现有的并不在数据 ...

  6. 更相减损法java,五十六、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」❞ 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾 ...

  7. 更相减损法java,五十6、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」git ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」github ❞ 先问大家一个小学问题:「如何求两个整 ...

  8. 更相减损术程序设计c语言,更相减损术

    本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合 ...

  9. C语言 用更相减损术求最大公约数,最小公倍数

    更相减损术 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. 出处 <九章算术> 用途 求最大公约数 作用 ...

最新文章

  1. mysql和jdbc的区别_JDBC详解
  2. TCP超时与重传机制与拥塞避免
  3. 可以直接用的“ html转字符串string”方法
  4. Spring笔记——2.使用Spring容器
  5. CountDownLatch 初识
  6. Kaggle问题总结1
  7. SpringMVC的数据响应
  8. 【jQuery实例】Ajax登录页面
  9. 如何编程实现iAMT无线功能的禁用和开启
  10. shell判断字符串为空
  11. linux mpeg4ip 编译,利用Linux实现MPEG4流媒体技术
  12. 《多媒体在初中数学中的运用研究》课题研究报告
  13. 解决 Please use the NLTK Downloader to obtain the resource
  14. 微信小程序-各种跳转
  15. 女性游戏市场崛起,B站能否能否抓住风口打造下一个FGO?
  16. 短网址还原 php,php简单实现短网址(短链)还原的方法(测试可用),php还原_PHP教程...
  17. ASIHTTPRequest类库的简单介绍
  18. 自制python图片下载器
  19. MSM搭建(Memcached_Session_Manager)--解决集群session共享
  20. opencv android 透视,Opencv for Android 之透视变换

热门文章

  1. 线性回归----多项式回归
  2. 2007 笔记本电脑 品牌排行榜
  3. 可能是最全面的国内外知名404页面盘点
  4. 曼达洛人对机器人的评价_机器人作文评语大全
  5. 4s系统如何连接电脑连接服务器,iphone4s怎么连接电脑
  6. 从炉石传说卡组推荐理解ASO搜索优化,aso搜索优化怎么用
  7. 观看2014年DotNetConf的所有视频
  8. TZC 1283: 简单排序 —— 希尔排序
  9. jps,jstat,jinfo,jstack,jmap,jhat
  10. galgame安卓_【安卓/galgame/多结局】三色绘恋