Java求解两个非负整数最大公约数算法【循环法与递归法】
作者:Su_CRF 发布时间:2021-10-15 13:53:48
本文实例讲述了Java求解两个非负整数最大公约数算法。分享给大家供大家参考,具体如下:
代码功能:
1.Java实现(完整源码附测试用例);
2.求解两个非负整数p,q(p>=q)的最大公约数;
3.循环法 以及 递归法两种求解思路;
完整源码:
/* GCD:Greateast Common Divisor */
public class GCD{
public static void main(String args[]){
/* Test Case */
int p = 32;
int q = 24;
System.out.println("The greatest divisior of "+p+" and "+q+" is \n"+
"[ gcd1 ] : "+gcd1(p,q)+"\n"+"[ gcd2 ] : "+ gcd2(p,q));
}
// (q % gcd ==0 AND p% gcd ==0 [gcd from q to 1])
public static int gcd1(int p,int q){
int gcd=1;
int d=q;
while(d>0){
d--;
if(q%d==0 && p%d==0){
gcd = d;
break;
}
}
return gcd;
}
// gcd(p,q)=gcd(q,p%q)[if q=0,gcd=p]
public static int gcd2(int p,int q){
if(q==0) return p;
int r = p%q;
//System.out.println("("+q+","+r+")");
return gcd2(q,r);
}
}
运行截图:
代码解释:
循环法 gcd1(p,q)
自然语言描述 :循环法求解两个非负整数p,q(p>=q)的最大公约数,即求解q的公约数中为p的公约数的最大值。令d(被除数)从p开始递减(递减step = 1)d始终为“即将满足条件的最大值”,当d满足条件(既可以被p整除又可以被p整除时),d即p与q的公约数,d即为p、q的最大公约数;
递归法 gcd2(p,q)
自然语言描述: 递归法求解两个非负整数p,q(p>=q)的最大公约数 ,当q等于0时,最大公约数为p;否则,对p、q取余得r=p%q,p、q的最大公约数即为q、r的最大公约数;
代码心得:
关于循环法,一开始我想到的是,写一个求解公约数的方法、用整型数组存储一个非负整数的全部公约数,然后比较找出p、q中共同的那个最大的公约数也就是两个数的最大公约数了,后来想想,既然是求最大,那么就直接从后往前递减岂不是更省事儿,从后往前递减就可以保证这个数一直是当前最大,因为比它大的家伙都不符合条件(能同时被p、q整除)被淘汰掉了啦,就免去了最初需要的找最大这个麻烦,虽然求最大值方法多多,但是如果自己已经或者原本就是就不需要去证明和寻找了哈哈,怎么感觉有点在说哲学 ;
关于递归法,我能依靠我的直觉完全理解的还只有那句p、q的最大公约数就是q、r(r=p%q)的最大公约数这个环的开始,但是还是不太理解环的结束条件 q为0,返回p;
虽然是很简单的求解最大公约数算法,但是非要用两种思路来写一下,主要还是为了再感受一下我不是很熟悉的递归法,以前看求解汉诺塔和斐波那契数的递归算法那明白白的公式亮在那里,就在感慨,这完全就是数学啊!今天学习到的这个,感触居然比那时候还要震撼,不知道发生了什么问题奇妙地就解决了。我到时没太在意什么内存啊、效率之类的指标,只是觉得能想到这个的家伙真的太聪明,对他们而言计算机也好、编程语言也好,真正做到了只是解决问题的工具。有人说,递归是让人脑去思考让计算机去计算的算法,感觉真的是很贴切的说法呢。
参考资料
图灵程序设计丛书:算法(第4版) 塞奇威克 (Robert Sedgewick) (作者), 韦恩 (Kevin Wayne) (作者), 谢路云 (译者)
希望本文所述对大家java程序设计有所帮助。
来源:https://blog.csdn.net/cook2eat/article/details/44986493


猜你喜欢
- 一、WebSocket简介WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。在WebSocket应
- 前言平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了
- 和室友参加的互联网大赛要做一个 APP,涉及到用户的登录注册,于是上网找了许多资料,其中有阿里大于,网易云等等,阿里大于的客服给我说他们不支
- 如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・
- 用Stopwatch分段监控了一下,发现耗时最多的函数是SaveToExcel此函数中遍列所有数据行,通过Replace替换标签生成Exce
- 当游戏在手机/模拟器上卡死,logcat没有日志输出,也没有卡死堆栈信息或者bugly也没有捕获到异常,你是否很焦急?本文介绍一下我们项目中
- 在 Kotlin 中,reduce() 和 fold() 是函数式编程中常用的高阶函数。它们都是对集合中的元素进行聚合操作的函数,将一个集合
- 这几天看了下之前写的有关微信支付的博客,看的人还是挺多的,看了下留言不知道是因为博客写的不够细还是什么情况,大多都找我要源码,我觉得吧程序员
- 前言 为什么在kotlin要使用协程呢,这好比去了重庆不吃火锅一样的道理。协程的概念并
- 本文实例讲述了C#从画刷创建画笔的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Coll
- Android可以在所有应用上方添加View,就是给WindowManager添加一个View,在创建的View的时候可以给这个View设置
- 本文实例讲述了WPF弹出自定义窗口的方法。分享给大家供大家参考,具体如下:测试环境:[1]VS2010SP1[2]WPF(.NET Fram
- 匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: n
- 本文实例为大家分享了Flutter自定义圆盘取色器的具体代码,供大家参考,具体内容如下下面展示一些 内联代码片。圆盘取色器效果图完整代码im
- Java的IO是一个大知识点,如果把它的知识点拆开来说的话估计能说一个星期,关于IO的体系可以看看下面这张图,接下来我们从一段代码开始聊吧,
- 本文实例为大家分享了Winform实现导入导出Excel文件的具体代码,供大家参考,具体内容如下/// <summary> &n
- 有很多制作精良的APP都自带点击音效,那么如何简单的来实现这一效果,这里需要使用到的一个概念叫做SoundPool,这个类主要用于播放一些比
- 界面中控件较多的话,每个控件都设置setOnClickListener(this)是很麻烦的,为此抽出了一个Context的扩展类:fun
- 1.常用属性Name:名称;BackColor:设置控件背景颜色;Enabled:是否可用;FlayStyle:控件样式;Image:设置控
- 当我们开发spring web应用程序时,对于如 IOException , ClassNotFoundException 之类的检查异常,