这篇文章讲述的是算法趣味分数部分的分数比大小问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
比较两个分数的大小
算法分析
- 计算两个分母的最小公倍数,把两个分数进行通分,再比较分子,分子大的就大。
- 时间复杂度:O(log n) , 空间复杂度:O(1)
代码实现
package fraction;
/**
* @author 叶清逸
* @date 2018年7月28日下午11:03:55
* @version 1.0
* @project fraction
*/
public class Q7_CompareFraction {
/**
* 问题描述:比较两个分数的大小
*
* 算法分析:计算两个分母的最小公倍数,把两个分数进行通分,再比较分子,分子大的就大。
*
* 复杂度分析:时间复杂度:O(log n) , 空间复杂度:O(1)
*/
public static void main(String[] args) {
/*初始化连个要比较的分数a/b , c/d*/
int a = 8 ;
int b = 4 ;
int c = 16 ;
int d = 32 ;
/*两个分数进行通分*/
int lcm = LCM(b , d) ; //计算两个分母的最小公倍数
int t1 = lcm/b ; //把两个数的分子乘上通分倍数
int a1 = a*t1 ;
int t2 = lcm/d ;
int a2 = c*t2 ;
/*比较分子的大小*/
if(a1 < a2){
System.out.println(a+"/"+b+" < "+c+"/"+d);
}else if(a1 == a2){
System.out.println(a+"/"+b+" = "+c+"/"+d);
}else{
System.out.println(a+"/"+b+" > "+c+"/"+d);
}
}
/**
*
* @explain LCM方法: 求出参数a和参数b的最小公倍数
* @param a 参数a
* @param b 参数b
* @return int 返回两个参数的最小公倍数
* @throws
* @author 叶清逸
* @date 2018年7月28日 下午11:11:36
*/
public static int LCM(int a , int b){
/*排序保证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 ;
/*使用公式算出最小公倍数*/
int lcm = a*b/gcd ;
return lcm ;
}
}
样例输出
8/4 > 16/32