算法面试题(一) 给定分数进行化解

题目 : 给定一个分数,对其进行化解为最简分数。例如分数16/12 答案是 :4 / 3

public class Test01 {
    public static void main(String[] args) {
        while (true) {
            try {
                Scanner scanner = new Scanner(System.in);
                int zi = scanner.nextInt();
                int mu = scanner.nextInt();
                System.out.println("答案为 : " + result(zi, mu));
            } catch (Exception e) {
                System.out.println("输入的格式不正确,请重新输入!");
            }
        }
    }

    /**
     * 对分数进行化解
     *
     * @param zi 分子
     * @param mu 分母
     * @return result
     */
    private static String result(int zi, int mu) {
        //判断 分子分母是否为0 / 正数 / 负数
        int compareMu = Integer.compare(mu, 0);
        int compareZi = Integer.compare(zi, 0);

        //如果分母为0
        if (compareMu == 0) {
            return "分母不能为0";
        }

        //如果分子为0
        if (compareZi == 0) {
            return "0";
        }

        //确定最终结果为负为正
        String sign = judeSign(compareMu, compareZi);

        //将分子/分母转为正数
        zi = Math.abs(zi);
        mu = Math.abs(mu);

        //将分子分母最小数作为循环次数
        int min = Math.min(mu, zi);
        int count = min;
        while (count > 1) {
            //判断分子/分母是否能整除
            boolean ziYueShu = getInteger(zi, count);
            boolean muYueShu = getInteger(mu, count);

            //如果分子/分母均能被整除
            if (ziYueShu && muYueShu) {
                //更新分子分母数据
                zi /= count;
                mu /= count;

                //更新最小值
                min = Math.min(mu, zi);
                count = min;
            } else {
                count--;
            }
        }

        //如果分母为1 则直接输出结果
        if (mu == 1) {
            return sign + zi;
        }

        return sign + zi + " / " + mu;
    }

    /**
     * 判断被除数是否能整除
     *
     * @param dividend 被除数
     * @param divisor  除数
     * @return 整除返回true 否则返回false
     */
    private static boolean getInteger(int dividend, int divisor) {
        int resultInt = dividend / divisor;
        double resultDouble = (double) dividend / (double) divisor;

        return resultInt == resultDouble;
    }

    /**
     * 判断最终结果正负
     *
     * @param a number1
     * @param b number2
     * @return 正数返回ture 否则返回false
     */
    private static String judeSign(int a, int b) {
        return a / b > 0 ? "" : "-";
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值