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

 更新时间:2018年03月25日 11:39:43   作者:Su_CRF  
这篇文章主要介绍了Java求解两个非负整数最大公约数算法,结合实例形式分析了java求解最大公约数的实现方法,并附带了循环法与递归法算法思路,需要的朋友可以参考下

本文实例讲述了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算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • spring中的BeanFactory与FactoryBean的讲解

    spring中的BeanFactory与FactoryBean的讲解

    今天小编就为大家分享一篇关于spring中的BeanFactory与FactoryBean的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Springboot获取jar包中resources资源目录下的文件

    Springboot获取jar包中resources资源目录下的文件

    今天在项目中遇到一个业务场景,需要用到resources资源目录下的文件,本文主要介绍了Springboot获取jar包中resources资源目录下的文件,感兴趣的可以了解一下
    2023-12-12
  • springboot如何重定向外部网页

    springboot如何重定向外部网页

    这篇文章主要介绍了springboot如何重定向外部网页,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • seata springcloud整合教程与遇到的坑

    seata springcloud整合教程与遇到的坑

    seata 是alibaba 出的一款分布式事务管理器,他有侵入性小,实现简单等特点。这篇文章主要介绍了seata springcloud整合教程与遇到的坑,需要的朋友可以参考下
    2021-07-07
  • SpringBoot深入分析讲解监听器模式下

    SpringBoot深入分析讲解监听器模式下

    监听器模式,大家应该并不陌生,主要的组成要素包括了事件、监听器以及广播器;当事件发生时,广播器负责将事件传递给所有已知的监听器,而监听器会对自己感兴趣的事件进行处理
    2022-07-07
  • Java中Scanner类基础使用、可能遇到的问题及注意事项

    Java中Scanner类基础使用、可能遇到的问题及注意事项

    Scanner类是一个用于Scanner指的是java.util包下的Scanner类,可以接收控制台输入的数据,这篇文章主要介绍了Java中Scanner类基础使用、可能遇到的问题及注意事项的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • SpringBoot同时集成Mybatis和Mybatis-plus框架

    SpringBoot同时集成Mybatis和Mybatis-plus框架

    在实际开发中,项目里面一般都是Mybatis和Mybatis-Plus公用,但是公用有版本不兼容的问题,本文主要介绍了Spring Boot项目中同时集成Mybatis和Mybatis-plus,具有一档的参考价值,感兴趣的可以了解一下
    2024-12-12
  • 快速入门HarmonyOS的Java UI框架的教程

    快速入门HarmonyOS的Java UI框架的教程

    这篇文章主要介绍了快速入门HarmonyOS的Java UI框架,本文给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • SpringMVC的最小化配置说明

    SpringMVC的最小化配置说明

    这篇文章主要介绍了SpringMVC的最小化配置说明,Spring MVC是一个基于Java的Web框架,用于构建灵活、高效的Web应用程序,它采用了MVC的设计模式,将应用程序的逻辑分为模型、视图和控制器三个部分,以实现代码的分离和重用,需要的朋友可以参考下
    2023-10-10
  • IDEA 集成log4j将SQL语句打印在控制台上的实现操作

    IDEA 集成log4j将SQL语句打印在控制台上的实现操作

    这篇文章主要介绍了IDEA 集成log4j将SQL语句打印在控制台上的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论