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);
}
}

运行截图:

Java求解两个非负整数最大公约数算法【循环法与递归法】

代码解释:

循环法 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

标签:Java,最大公约数,算法
0
投稿

猜你喜欢

  • 详解Android获取所有依赖库的几种方式

    2023-12-13 05:41:51
  • SpringBoot集成mybatis实例

    2023-03-09 16:57:01
  • Android使用Matrix旋转图片模拟碟片加载过程

    2022-08-22 21:07:32
  • Java贪吃蛇游戏完善版

    2023-04-12 03:07:53
  • java8实现List中对象属性的去重方法

    2023-08-30 20:50:48
  • 解决在for循环中remove list报错越界的问题

    2022-01-12 15:27:56
  • java多线程之停止线程的方法实例代码详解

    2023-03-23 04:35:21
  • SprinBoot如何集成参数校验Validator及参数校验的高阶技巧

    2023-10-23 16:24:31
  • C# 输出参数out问题

    2023-02-27 00:19:32
  • Android ScrollView 下嵌套 ListView 或 GridView出现问题解决办法

    2023-03-31 07:17:04
  • Spring Security添加验证码的两种方式小结

    2021-08-05 17:24:25
  • Android 优化之app启动优化的实现

    2023-10-11 07:31:22
  • ReactNative Alert详解及实例代码

    2022-07-04 15:02:46
  • Android基于ListView实现类似Market分页加载效果示例

    2021-10-01 10:44:32
  • c#多线程网络聊天程序代码分享(服务器端和客户端)

    2022-08-10 00:32:48
  • Android自定义控件实现UC浏览器语音搜索效果

    2022-06-01 06:59:40
  • C#实现线程安全的简易日志记录方法

    2023-12-20 22:45:17
  • SpringBoot+Swagger-ui自动生成API文档

    2023-06-19 07:38:34
  • 使用JDBC实现数据访问对象层(DAO)代码示例

    2021-11-12 23:33:46
  • Android TextView实现带链接文字事件监听的三种常用方式示例

    2021-10-12 23:59:35
  • asp之家 软件编程 m.aspxhome.com