Problem Description
编写一个C程序,实现两个分数的加减法
Input
输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+“或者”-"。
数据以EOF结束
输入数据保证合法
Output
对于输入数据的每一行输出两个分数的运算结果。
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数
Sample Input
1/8+3/8
1/4-1/2
1/3-1/3
Sample Output
1/2
-1/4
0
Hint
Source
package hello;
import java.util.Scanner;
class Frac{ // 定义该运算类
String str;
int a, b, c, d;
char Operator;
int denominator;
int molecule;
public Frac(String str) { // 获取运算式字符串
this.str = str;
}
public void Get() { // 将字符串中的数字及运算符转换
this.a = str.charAt(0)-'0';
this.b = str.charAt(2)-'0';
this.Operator = str.charAt(3);
this.c = str.charAt(4)-'0';
this.d = str.charAt(6)-'0';
}
public int Gcd(int m, int n) { // 求最小公倍数,用于分数约分
if (n > m) {
int t = n;
n = m;
m = t;
}
while (m%n != 0) {
int r = m%n;
m = n;
n = r;
}
return n;
}
public void Operation() { // 进行运算
Get(); // 获取相应的参数
if (b!=d) { // 分母不相同时,分母分子做相应运算
denominator = b*d;
if (Operator == '-') {
molecule = a*d - b*c;
}
else {
molecule = a*d + b*c;
}
}
else {
denominator = b;
if (Operator == '-') {
molecule = a - c;
}
else {
molecule = a + c;
}
}
if(molecule != 0&&molecule%denominator != 0) { // 分子不为零且分子不能整除分母时
int temp = Gcd(denominator, molecule); // 获取最大公约数
int endmol = molecule/temp; // 分数约分
int endden = denominator/temp;
if (endden<0) { // 防止分母为负数,相当于分子分母同乘-1
endmol = -endmol;
endden = -endden;
}
System.out.println(endmol+"/"+endden);
}
else if (molecule!=0&&molecule%denominator == 0) { // 分子可以整除分母时,直接整除
System.out.println(molecule/denominator);
}
else { // 分子为0时,直接输出0
System.out.println(0);
}
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String str = sc.nextLine();
Frac nb = new Frac(str);
nb.Operation();
}
}
}