题目描述
使用Java实现分数的四则运算,每行输入一次运算,只考虑两个分数之间的运算。
输入示例
输入
1/3 \ 5/8
输出
8/15
输入
2/3 + 4/3
2
算法思路
- 获得输入分数的分子分母和运算符
- 求出分母的最小公倍数,即求出分母的最大公约数
- 匹配运算规则
我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《C语言四种方法求最大公约数》, 一起来围观吧
注意事项
- 参与运算的分数,分母不能为 0,需要对无效的分数进行处理
- 参与运算的分数,分子为 0 时,对于乘法而言,直接判定结果为 0;对于除法而言,除数为 0 时,直接判定结果为 0,被除数不能为 0(同样为无效的分数)
- 对于运算的结果,需要要进行化简;如果结果为正,省略 + 号,结果为负,输出第一位应该为 - 号
实现代码
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);
}
}