算法_趣味分数_Question1_最大公约数(java实现)

【算法_趣味分数_Question1_最大公约数(java实现)】这篇文章讲述的是算法趣味分数部分的最大公约数问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述 求任意两个数的最大公约数(GCD),最大公约数如果一个自然数a可以被自然数b整除,则称a为b的倍数,b为a的倍数。几个自然数有共有的约数,叫作这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数
算法分析 该题有两种解决方案,第一种穷举法,从2开始遍历,找出同时能被这两个数整除的所有数取其最大值。第二种辗转相除法:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
代码实现

  • 方法一(穷举法):
package fraction; /** * @author 叶清逸 * @date 2018年7月18日上午12:18:37 * @version 1.0 * @project fraction */ public class Q1_GCD { /** * 问题分析:求任意两个数的最大公约数(GCD),最大公约数如果一个自然数a可以被自然数b整除,则称a为b的倍数,b为a的倍数。几个 *自然数有共有的约数,叫作这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。 * * 算法分析:该题有两种解决方案,第一种穷举法,从2开始遍历,找出同时能被这两个数整除的所有数取其最大值。第二种辗转相除法: *用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最 *后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 */public static void main(String[] args) { method1() ; }/*遍历法求出最大公约数*/ private static void method1() { /*初始化两个数a,b*/ int a = 56 ; int b = 72 ; int gcd = 0 ; /*排序保证a始终小于b*/ if(a > b){ int t = a ; a = b ; b = t ; } /*遍历求最大公约数*/ for(int i=2 ; i

  • 方法二(辗转相除法):
package fraction; /** * @author 叶清逸 * @date 2018年7月18日上午12:18:37 * @version 1.0 * @project fraction */ public class Q1_GCD { /** * 问题分析:求任意两个数的最大公约数(GCD),最大公约数如果一个自然数a可以被自然数b整除,则称a为b的倍数,b为a的倍数。几个 *自然数有共有的约数,叫作这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。 * * 算法分析:该题有两种解决方案,第一种穷举法,从2开始遍历,找出同时能被这两个数整除的所有数取其最大值。第二种辗转相除法: *用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最 *后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 */public static void main(String[] args) { method2() ; } /*辗转相除法求最大公约数*/ private static void method2(){ /*初始化两个数a,b*/ int a = 8 ; int b = 4 ; /*排序保证a始终小于b*/ if(a > b){ int t = a ; a = b ; b = t ; } /*复制变量a和b,不造成变量被修改*/ int c = a ; int d = b ; /*辗转相除*/ while(c%d != 0){ //k保存余数 int k = c%d ; //除数变为c c = d ; //被除数变为余数 d = k ; } /*辗转相除结束后的c即为所求的最大公约数*/ System.out.println(a+"和"+b+"的最大公约数为:"+d); } }

样例输出
56和72的最大公约数为:8 4和8的最大公约数为:4

    推荐阅读