[算法]Java实现 求两个非负整数最大公约数 循环法 递归法
来源:互联网 发布:unity3d选中物体高亮 编辑:程序博客网 时间:2024/06/06 12:56
[算法]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求两个非负整数之间的最大公约数
- 求两个非负整数的最大公约数
- 计算两个非负整数的最大公约数(欧几里得算法)
- 计算两个非负整数的最大公约数
- 计算两个非负整数的最大公约数
- 算法实现求两个整数的最大公约数!
- 欧几里得求两个整数最大公约数算法的汇编递归实现代码
- 欧几里得算法求最大公约数的递归和非递归实现
- 实现两个非负整数相乘
- c++实现用欧几里得算法求两个整数的最大公约数
- 求最大公约数--递归法实现
- 求最大公约数(非递归法)
- 欧几里得算法求两个非负整数的最大公因子
- 求两个整数的最大公约数算法
- 将一个非负十进制整数转换成二进制数,用非递归算法和递归算法来实现
- 算法---求两个数的最大公约数(递归)
- 剑指offer--旋转数组的最小数字
- cocos2d-x 3.x新建项目
- XStream - Javabean转XML文档
- Multiply Strings
- HDU 1228----A+B
- [算法]Java实现 求两个非负整数最大公约数 循环法 递归法
- 剑指offer--斐波那契数列
- 基数排序算法的C++实现
- 面试之常用算法总结
- 剑指offer--二进制中1的个数
- 证明素数有无限多个(《具体数学》上的方法)
- 启动动画问题startAnimation
- HashMap简析
- zookeeper 权限概述