「辗转相除法」又叫做「欧几里得算法」,是公元前 300 年左右的希腊数学家欧几里得在他的著作《几何原本》提出的.利用这个方法,可以较快地求出两个自然数的最大公因数,即 HCF 或叫做 gcd.
最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf)
所谓最大公因数,是指几个数的共有的因数之中最大的一个,例如 8 和 12 的最大公因数是 4,记作 gcd(8,12)=4. 
在介绍这个方法之前,先说明整除性的一些特点,注以下文的所有数都是正整数,以后不再重覆. 
我们可以这样给出整除以的定义: 
对於两个自然数 a 和 b,若存在正整数 q,使得 a=bq,则 b 能整除 a,记作 b | a,我们叫 b 是 a 的因数,而 a 是 b 的倍数. 
那麼如果 c | a,而且 c | b,则 c 是 a 和 b 的公因数. 
由此,我们可以得出以下一些推论: 
推论一:如果 a | b,若 k 是整数,则 a | kb.因为由 a | b 可知 ha=b,所以 (hk)a=kb,即 a | kb. 
推论二:如果 a | b 以及 a | c,则 a | (b±c).因为由 a | b 以及 a | c,可知 ha=b,ka=c,二式相加,得 (h+k)a=b+c,即 a | (b+c).同样把二式相减可得 a | (b-c). 
推论三:如果 a | b 以及 b | a,则 a=b.因为由 a | b 以及 b | a,可知 ha=b,a=kb,因此 a=k(ha),hk=1,由於 h 和 k 都是正整数,故 h=k=1,因此 a=b. 
辗转相除法是用来计算两个数的最大公因数,在数值很大时尤其有用而且应用在电脑程式上也十分简单.其理论如下: 
如果 q 和 r 是 m 除以 n 的商及余数,即 m=nq+r,则 gcd(m,n)=gcd(n,r). 
证明是这样的: 
设 a=gcd(m,n),b=gcd(n,r) 
则有 a | m 及 a | n,因此 a | (m-nq)(这是由推论一及推论二得出的),即 a | r 及 a | n,所以 a | b 
又 b | r 及 b | n,所以 b | (nq+r),即 b | m 及 b | n,所以b | a.因为 a | b 并且 b | a,所以 a=b,即 gcd(m,n)=gcd(n,r). 
例如计算 gcd(546, 429),由於 546=1(429)+117,429=3(117)+78,117=1(78)+39,78=2(39),因此 
gcd(546, 429) 
=gcd(429, 117) 
=gcd(117, 78) 
=gcd(78, 39) 
=39

Java实现代码如下:

public class GcdTest {int gcd1(int a, int b) {// 循环实现int k = 0;do {k = a % b;// 得到余数a = b;// 根据辗转相除法,把被除数赋给除数b = k;// 余数赋给被除数} while (k != 0);return a;// 返回被除数}int gcd2(int a, int b) {// 逆归实现if (b == 0) {// 直到满足此条件逆归退出return a;}if (a < 0) {return gcd2(-a, b);}if (b < 0) {return gcd2(a, -b);}return gcd2(b, a % b);}public static void main(String[] args) {GcdTest gt = new GcdTest();System.out.println(gt.gcd1(888, 458));System.out.println(gt.gcd2(888, 458));}
}

辗转相除法 原理 Java实现相关推荐

  1. 【Java 虚拟机原理】JDK 体系结构 | Java 源码运行原理 | Java 虚拟机内存

    文章目录 一.JDK 体系结构 二.Java 源码运行原理 三.Java 虚拟机内存结构 一.JDK 体系结构 JDK 体系结构 : 下图所有的内容都是 JDK 体系中的组成元素 ; Java Lan ...

  2. Java form表单原理,动态表单及动态建表实现原理[Java编程]

    赞助商链接 本文"动态表单及动态建表实现原理[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下 ...

  3. 辗转相除法原理学习记录

    辗转相除法原理记录 "假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z. 那么x一定能被z整除,y也一定能被z整除,所以x和y的线性组合mx±ny也一定能被z整除. ...

  4. 深入分析Spark任务调度的原理--Java后端同学入门Spark编程系列

    作者:陌北有棵树,Java人,架构师社区合伙人! 之前写了一篇:<我作为Java后端,分享一下入门Spark编程的经历!> 上篇是Spark入门的第一篇,写了一些关于Spark编程中RDD ...

  5. java lock的原理,Java中Lock原理探究

    在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...

  6. JVM优化原理—Java架构师必须要知晓的知识

    想要成为一名出色的Java架构师,必须要彻底了解Java的一个重要的特点那就JVM                                                           ...

  7. Google 以图搜图 - 相似图片搜索原理 - Java实现

    前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动要将这些原理实现出来了. Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相 ...

  8. 详细过程MD5加密的原理+java实现

    MD5加密 加密原理 大端小端 算法 代码实现 加密原理 大端小端 一个字节是8位即0000 0000,它能表示2^8=256个数,最大的数为255,那我们如果要表示数256,就需要两个字节即16位, ...

  9. 以图搜图 - Google 相似图片搜索原理 - Java实现

    转自:http://blog.csdn.net/luohong722/article/details/7100058 前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动 ...

最新文章

  1. 【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
  2. 2020-12-28-bitset函数
  3. db 文件 加密_有人说Kettle 数据库JNDI方式数据库密码不能加密,搞他!
  4. JavaScript字幕滚动效果
  5. nova 之compute服务
  6. 实用干货:电放提单详解,与海运单、一般提单到底有什么区别?
  7. 文件过大 不能导入U盘怎么办
  8. dubbo暴露出HTTP服务
  9. linux用户态内核态通信,内核态与用户态通信 之 sockopt
  10. oracle cmd命令导入,oracle使用cmd命令导入数据库
  11. MybatisPlus:使用SQL保留字(关键字)
  12. “百花齐放”电商时代,网易七鱼打造专业电商客服
  13. mysql管理器打不开_我安装好了MySQL.. 控制台却打不开... 有什么办法打开MySQL的控制台...
  14. 统计学 统计值判断标准
  15. Microsoft Virtual WiFi Miniport Adapter 使用方法
  16. Python爬虫笔记————抓取 猫眼电影排行榜Top100
  17. 飞腾S2500平台PCIe SWITCH下热插拔验证
  18. 密码学1024大作业
  19. sqlite数据库查询语句,数据库中是否存在某个表
  20. Google Play 上架总结(二)Google账户关联详解

热门文章

  1. 如何更好地学习新概念英语
  2. Mac根目录下无法创建文件夹
  3. unity,通俗解释什么是协程
  4. LeetCode刷题框架总结
  5. Java获取IPv4/IPv6地理位置-IP地址库
  6. R语言GWR地理加权回归
  7. Java 日志框架详解
  8. 中标麒麟系统u盘安装_中标麒麟学习笔记1:安装7.0桌面版操作系统
  9. Linux系统编程之捕捉SIGCHLD
  10. linux及时释放内存,LINUX释放内存