这篇文章讲述的是算法趣味分数部分的最大公约数问题的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<b ; i++){
/*判断是否为约束,即是否能整除*/
if(a%i==0 && b%i==0){
gcd = i ;
}
}
/*输出结果*/
System.out.println(a+"和"+b+"的最大公约数为:"+gcd);
}
- 方法二(辗转相除法):
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