本题要求编写程序,计算 2 个有理数的和、差、积、商。
输入格式:
输入在一行中按照 a1/b1 a2/b2
的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。
输出格式:
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果
的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b
,其中 k
是整数部分,a/b
是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf
。题目保证正确的输出中没有超过整型范围的整数。
输入样例 1:
2/3 -4/2
输出样例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例 2:
5/3 0/6
输出样例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
代码实现:
import java.io.*;
/**
* @author yx
* @date 2022-07-16 20:34
*/
public class Main {
static PrintWriter out=new PrintWriter(System.out);
static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in=new StreamTokenizer(ins);
public static void main(String[] args) throws IOException {
//分步骤切割字符串
String[] split=ins.readLine().split(" ");
String[] fir=split[0].split("/");
String[] sec=split[1].split("/");
long a1=Integer.parseInt(fir[0]);
long b1=Integer.parseInt(fir[1]);
long a2=Integer.parseInt(sec[0]);
long b2=Integer.parseInt(sec[1]);
// System.out.println(-7%2);
if(b1!=0&&b2!=0){
add(a1,b1,a2,b2);
minus(a1,b1,a2,b2);
multiply(a1,b1,a2,b2);
divide(a1,b1,a2,b2);
}
// System.out.println(a1+" "+b1+" "+a2+" "+b2);
}
//处理有理数
static void hua_Jian(long a,long b){
if(a==0){
System.out.print(0);
return;
}
//定义一个哨兵
boolean flag=false;
/*
这个地方必须先判断再取余
先取余,再判断的话会影响a的正负性质
*/
if(a<0){
System.out.print("(-");
a=-a;
flag=true;
}
//对a/b进行化简
long g=gcd(a,b);
a=a/g;
b=b/g;
//下面这种写法不可取,因为a=a/gcd(a,b),此时的a已经发生改变
//这个时候b=b/gcd(a,b)得出来的答案不正确
// a=a/gcd(a,b);
// b=b/gcd(a,b);
// if(a%b==0){
// System.out.print(a/b);
// }else {
/*
a有可能会为负数,不能用a/b>1
而是Math.abs(a)>b
*/
// if(a/b>1){
// System.out.print(a/b+" "+(a%b)+"/"+b);
// }else if(a==b){
// System.out.print(1);
// }else {
// System.out.print(a+"/"+b);
// }
// }
if (a % b == 0) {
System.out.print(a / b);
} else if (Math.abs(a) > b) {
System.out.print(a / b + " " + (a % b) + "/" + b);
} else if (a == b) {
System.out.print(1);
} else {
System.out.print(a + "/" + b);
}
if(flag){
System.out.print(")");
}
}
//加
static void add(long a1,long b1,long a2,long b2){
hua_Jian(a1,b1);
System.out.print(" + ");
hua_Jian(a2,b2);
System.out.print(" = ");
hua_Jian(a1*b2+a2*b1,b1*b2);
System.out.println();
}
//减
static void minus(long a1,long b1,long a2,long b2){
hua_Jian(a1,b1);
System.out.print(" - ");
hua_Jian(a2,b2);
System.out.print(" = ");
hua_Jian(a1*b2-a2*b1,b1*b2);
System.out.println();
}
//乘
static void multiply(long a1,long b1,long a2,long b2){
hua_Jian(a1,b1);
System.out.print(" * ");
hua_Jian(a2,b2);
System.out.print(" = ");
hua_Jian(a1*a2,b1*b2);
System.out.println();
}
//除
static void divide(long a1,long b1,long a2,long b2){
hua_Jian(a1,b1);
System.out.print(" / ");
hua_Jian(a2,b2);
System.out.print(" = ");
if(a2==0){
System.out.println("Inf");
return;
}
if(a2<0){
hua_Jian(-1*a1*b2,-1*a2*b1);
}else {
hua_Jian(a1*b2,a2*b1);
}
}
//最大公约数
static long gcd(long m,long n){
return n==0?m:gcd(n,m%n);
}
}