Java实现分数的四则运算

题目描述

 使用Java实现分数的四则运算,每行输入一次运算,只考虑两个分数之间的运算。

输入示例

 输入
 1/3 \ 5/8
 输出
 8/15

 输入
 2/3 + 4/3
 2

算法思路

  1. 获得输入分数的分子分母和运算符
  2. 求出分母的最小公倍数,即求出分母的最大公约数
  3. 匹配运算规则

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《C语言四种方法求最大公约数》, 一起来围观吧

注意事项

  1. 参与运算的分数,分母不能为 0,需要对无效的分数进行处理
  2. 参与运算的分数,分子为 0 时,对于乘法而言,直接判定结果为 0;对于除法而言,除数为 0 时,直接判定结果为 0,被除数不能为 0(同样为无效的分数)
  3. 对于运算的结果,需要要进行化简;如果结果为正,省略 + 号,结果为负,输出第一位应该为 - 号

实现代码

import java.util.*;

public class Solution {
    public static int findMaxDivisor(int num1, int num2){
        //0.欧几里得法求最大公约数
        int a, b;
        if (num1 > num2){
            a = Math.abs(num1);   b = Math.abs(num2);
        }else {
            b = Math.abs(num1);   a = Math.abs(num2);
        }
        int demp = a%b;
        if (demp == 0)
            return b;
        else
            return findMaxDivisor(b,demp);
    }
    public static void fractionOper(String operation) {
        //0.获得分数和运算符
        String[] members = operation.split("\\s");
        String num1 = members[0];
        String num2 = members[2];
        String oper = members[1];
        //1.获得分子分母
        int[] mol = new int[2];
        int[] den = new int[2];
        String[] num = num1.split("/");
        mol[0] = Integer.parseInt(num[0]);
        den[0] = Integer.parseInt(num[1]);
        num = num2.split("/");
        mol[1] = Integer.parseInt(num[0]);
        den[1] = Integer.parseInt(num[1]);
        //2.找到最大公约数
        int mutiple = 0;
        int maxDivisor = findMaxDivisor(den[0], den[1]);
        mutiple = den[0]/maxDivisor*den[1];
        //3.根据运算符匹配计算
        int mols, dens;
        switch (oper){
            case "+":{
                mols = mol[0] * (den[1]/maxDivisor) + mol[1] * (den[0]/maxDivisor);
                if (mols == 0){
                    System.out.println(0);
                }else {
                    maxDivisor = findMaxDivisor(mols,mutiple);
                    if (mols % mutiple == 0)
                        System.out.println(mols/mutiple);
                    else
                        System.out.println(mols/maxDivisor + "/" + mutiple/maxDivisor);
                }
                break;
            }
            case "-":{
                mols = mol[0] * (den[1]/maxDivisor) - mol[1] * (den[0]/maxDivisor);
                if (mols == 0){
                    System.out.println(0);
                }else {
                    maxDivisor = findMaxDivisor(mols, mutiple);
                    if (mols % mutiple == 0)
                        System.out.println(mols / mutiple);
                    else
                        System.out.println(mols / maxDivisor + "/" + mutiple / maxDivisor);
                }
                break;
            }
            case "*":{
                if (mol[0] == 0||mol[1] == 0){
                    System.out.println(0);
                } else{
                    mols = mol[0]*mol[1];
                    dens = den[0]*den[1];
                    maxDivisor = findMaxDivisor(mols,dens);
                    String mark = mols*dens >0? "": "-";
                    if ( mols % dens == 0)
                        System.out.println(mols / dens);
                    else
                        System.out.println(mark
                                + Math.abs(mols)/maxDivisor
                                + "/"
                                + Math.abs(dens)/maxDivisor);
                    break;
                }
            }
            case "\\":{
                if (mol[0] == 0)
                    System.out.println(0);
                else if (mol[1] == 0)
                    return;
                else {
                    mols = mol[0]*den[1];
                    dens = den[0]*mol[1];
                    maxDivisor = findMaxDivisor(mols,dens);
                    String mark = mols*dens >0? "": "-";
                    if (mols % dens == 0)
                        System.out.println(mols / dens);
                    else
                        System.out.println(mark
                                + Math.abs(mols)/maxDivisor
                                + "/"
                                + Math.abs(dens)/maxDivisor);
                    break;
                }
                break;
            }
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String operation = sc.nextLine();
        fractionOper(operation);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆papa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值