java 算法 求最大公约数

本贴最后更新于 2409 天前,其中的信息可能已经沧海桑田

本人菜鸟一枚,突然之间,偶得上帝灵光闪现,突然感觉自己日子过的太轻松,然后,自杀式的买了一本算法书,从今天开始了地狱般的生活;
算法第一章讲的是,欧几里得算法求其目的就是找到两个数的最大公约数,然后,我马上关上书,喝了一杯茶,脑海中回想着,这都是啥??对于一个数学从来都没有及格的我来说,想放弃
吐槽完毕,说正题,何为最大公约数,直接百度,谷歌,360,通过一系列的查询,来个官方版的

f2c17fb4c473499fb366a29260637521-WX201709142137142x.png

这。。。。是啥?没看懂
其实,最大公约数,即为能够同时被两个整数除的最大的数,还不懂?上图
02e760411ab14b318ffed2f3ce3200c1-WX201709142141172x.png

如果还不懂,请关闭本页面,然后,打开百度,找个视频看一下吧!我无能为力了。
欧几里得算法:又称辗转相除法,用于计算两个正整数,a,b 的最大公约数,计算原理依赖于下面的定理
定理:gcd(a,b) = gcd(b,a mod b)(a>b 且 a mod b 不为 0)
有人会问,mod 是啥?这个是求余啊! _MOD_是求余运算符,例如 a mod b=c,表明 a 除以 b 余数为 c
证明:a 可以表示成 a = kb +r 则 r=a mod b
假设 d 是 a,b 的一个公约数,则有 d|a ,d|b 而,r=a-kb 因此 d|r
因此 d 也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,最大的公约数也必然相等

看懂没?我也没咋看懂

分析一下吧,
假设 x>y x 和 y 的最大公约数用 f(x,y)表示
假设 x/y = a
x%y = b
所以 ay+b = x
因为 a 为 x 除以的整数部分,b 为 x 除以 y 的余数部分,所以 a
y+b = x
将上面的调换一下 b= x-a*y
因为 x 和 y 都能被 f(x,y)整数 所以 f(x,y)是 x 和 y 的最大公约数
所以 b 也同样能被 f(x,y)整除 即 x 和 y 的最大公约数 f(x,y)它是 b 的约数,所以求 x 和 y 的最大公约数也就相当于求 y 和 b 的最大公约数(因为,这里 x>y 而且 x%y 肯定小于 y,所以,这样一来,我们的范围缩小了)
所以 欧几里得公式也就这么来了
f(x,y) = f(y,x%y)
所以,这个算法就是不停的迭代,直到找出 x%y=0 的时候,停止迭代,那个时候,最大的公约数就是 y 了

下面为,书中的一个求最大公约数的案例

/**
 * 算法分析: 
 * 计算两个非负数p和q的最大公约数,若q是0,则最大的公约数是p,否则,p除q,得到余数r,p和q最      
 * 大公约数即为q和r的最大公约数 
 * Created by huxd on 2017/9/14. 
 */
 
	//欧几里得算法
 public  static int gcd(int p ,int q){
	 if(q == 0) return p;
	 int r = p%q;
	 return gcd(q,r);
}

实际代码

package Test1;
import java.util.*;
public class Tset1 {

public static void (String[] args) {
Scanner scan = new Scanner(System.in);// 接收控制台输入的信息

  System.out.print("请输入第一个整数:");
 int x = scan.nextInt(); // 取出控制台输入的信息

  System.out.print("请输入第二个整数:");
 int y = scan.nextInt(); // 取出控制台输入的信息

  System.out.println(gcd(x, y));// 调用maxCommonDivisor()方法
  }

	public static int gcd(int x, int y) {

		// 防止输入为0
  if (x == 0 || y == 0) {
			return 0;
  }
		//添加一个保证 x>y
  if (x < y) {
			int temp = x;
  temp = y;
  y = x;
  }
		//算法实现
  if (x % y == 0) {
			return y;
  } else {
			return gcd(y, x % y);
  }
	}
}
  • 算法
    388 引用 • 254 回帖 • 22 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 44 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 526 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 346 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 7 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 229 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 250 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 70 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 132 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 84 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 492 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 6 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 427 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖 • 3 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    311 引用 • 1666 回帖 • 1 关注
  • 自由行
    1 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 597 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 593 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 199 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖