算法_趣味分数_Question7_分数比大小(java实现)

这篇文章讲述的是算法趣味分数部分的分数比大小问题的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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值