这篇文章讲述的是算法趣味分数部分的最小公倍数问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
求任意两个数的最小公倍数(LCM),最小公倍数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于两个整数来说,指该两数共有倍数中最小的一个。计算最小公倍数通常要借助最大公约数来辅助计算,二者关系为:
最小公倍数=两数乘积/最大公约数
算法分析
此题也有多种解决方法,第一种穷举法,从两数中最大一个数开始遍历找到一个数能同时除尽这两个数,这个数的最小的那个即为最小公倍数,第二种利用最小公倍数和最大公约数之间的关系,先算出最大公约数,再用公式计算出最小公倍数即可。
代码实现
- 方法一(穷举法):
package fraction;
/**
* @author 叶清逸
* @date 2018年7月18日上午12:56:44
* @version 1.0
* @project fraction
*/
public class Q2_LCM {
/**
* 问题分析:求任意两个数的最小公倍数(LCM),最小公倍数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,
* 对于两个整数来说,指该两数共有倍数中最小的一个。计算最小公倍数通常要借助最大公约数来辅助计算,二者关系为:
* 最小公倍数=两数乘积/最大公约数
*
* 算法分析:此题也有多种解决方法,第一种穷举法,从两数中最大一个数开始遍历找到一个数能同时除尽这两个数,这个数的最小的
* 那个即为最小公倍数,第二种利用最小公倍数和最大公约数之间的关系,先算出最大公约数,再用公式计算出最小公倍数
* 即可。
*/
public static void main(String[] args) {
method1() ;
method2() ;
}
/*穷举法*/
private static void method1(){
/*初始化两个数a,b*/
int a = 4 ;
int b = 5 ;
int lcm = 0 ;
/*排序保证a始终小于b*/
if(a > b){
int t = a ; a = b ; b = t ;
}
/*遍历求最小公倍数*/
for(int i=b ; ; i++){
/*判断是否满足定义*/
if(i%b==0 && i%a==0){
lcm = i ;
break ;
}
}
System.out.println(a+"和"+b+"的最小公倍数为:"+lcm);
}
}
- 方法二(公式法):
package fraction;
/**
* @author 叶清逸
* @date 2018年7月18日上午12:56:44
* @version 1.0
* @project fraction
*/
public class Q2_LCM {
/**
* 问题分析:求任意两个数的最小公倍数(LCM),最小公倍数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,
* 对于两个整数来说,指该两数共有倍数中最小的一个。计算最小公倍数通常要借助最大公约数来辅助计算,二者关系为:
* 最小公倍数=两数乘积/最大公约数
*
* 算法分析:此题也有多种解决方法,第一种穷举法,从两数中最大一个数开始遍历找到一个数能同时除尽这两个数,这个数的最小的
* 那个即为最小公倍数,第二种利用最小公倍数和最大公约数之间的关系,先算出最大公约数,再用公式计算出最小公倍数
* 即可。
*/
public static void main(String[] args) {
method1() ;
method2() ;
}
/*公式法*/
private static void method2(){
/*初始化两个数a,b*/
int a = 45 ;
int b = 63 ;
int lcm = 0 ;
/*排序保证a始终小于b*/
if(a > b){
int t = a ; a = b ; b = t ;
}
/*先求出最大公约数*/
int c = a ;
int d = b ;
int gcd = 0 ;
while(c%d != 0){
//k保存余数
int k = c%d ;
//除数变为c
c = d ;
//被除数变为余数
d = k ;
}
/*辗转相除结束后的c即为所求的最大公约数*/
gcd = d ;
/*使用公式算出最小公倍数*/
lcm = a*b/gcd ;
System.out.println(a+"和"+b+"的最小公倍数为:"+lcm);
}
}
样例输出
4和5的最小公倍数为:20
45和63的最小公倍数为:315