辗转相除法 原理 Java实现
「辗转相除法」又叫做「欧几里得算法」,是公元前 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实现相关推荐
- 【Java 虚拟机原理】JDK 体系结构 | Java 源码运行原理 | Java 虚拟机内存
文章目录 一.JDK 体系结构 二.Java 源码运行原理 三.Java 虚拟机内存结构 一.JDK 体系结构 JDK 体系结构 : 下图所有的内容都是 JDK 体系中的组成元素 ; Java Lan ...
- Java form表单原理,动态表单及动态建表实现原理[Java编程]
赞助商链接 本文"动态表单及动态建表实现原理[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下 ...
- 辗转相除法原理学习记录
辗转相除法原理记录 "假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z. 那么x一定能被z整除,y也一定能被z整除,所以x和y的线性组合mx±ny也一定能被z整除. ...
- 深入分析Spark任务调度的原理--Java后端同学入门Spark编程系列
作者:陌北有棵树,Java人,架构师社区合伙人! 之前写了一篇:<我作为Java后端,分享一下入门Spark编程的经历!> 上篇是Spark入门的第一篇,写了一些关于Spark编程中RDD ...
- java lock的原理,Java中Lock原理探究
在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...
- JVM优化原理—Java架构师必须要知晓的知识
想要成为一名出色的Java架构师,必须要彻底了解Java的一个重要的特点那就JVM ...
- Google 以图搜图 - 相似图片搜索原理 - Java实现
前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动要将这些原理实现出来了. Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相 ...
- 详细过程MD5加密的原理+java实现
MD5加密 加密原理 大端小端 算法 代码实现 加密原理 大端小端 一个字节是8位即0000 0000,它能表示2^8=256个数,最大的数为255,那我们如果要表示数256,就需要两个字节即16位, ...
- 以图搜图 - Google 相似图片搜索原理 - Java实现
转自:http://blog.csdn.net/luohong722/article/details/7100058 前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动 ...
最新文章
- 【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
- 2020-12-28-bitset函数
- db 文件 加密_有人说Kettle 数据库JNDI方式数据库密码不能加密,搞他!
- JavaScript字幕滚动效果
- nova 之compute服务
- 实用干货:电放提单详解,与海运单、一般提单到底有什么区别?
- 文件过大 不能导入U盘怎么办
- dubbo暴露出HTTP服务
- linux用户态内核态通信,内核态与用户态通信 之 sockopt
- oracle cmd命令导入,oracle使用cmd命令导入数据库
- MybatisPlus:使用SQL保留字(关键字)
- “百花齐放”电商时代,网易七鱼打造专业电商客服
- mysql管理器打不开_我安装好了MySQL.. 控制台却打不开... 有什么办法打开MySQL的控制台...
- 统计学 统计值判断标准
- Microsoft Virtual WiFi Miniport Adapter 使用方法
- Python爬虫笔记————抓取 猫眼电影排行榜Top100
- 飞腾S2500平台PCIe SWITCH下热插拔验证
- 密码学1024大作业
- sqlite数据库查询语句,数据库中是否存在某个表
- Google Play 上架总结(二)Google账户关联详解