#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
key:求两个有理数的和差积商,注意化简的模板
有些地方要用绝对值比较,另外注意输出格式的空格

typedef long long ll; //记ll为long long
ll gcd(ll a,ll b){ //求a与b的最大公约数
return b== 0? a : gcd(b,a%b);
}
struct Fraction{ //分数
ll up,down; //分子分母
}a,b;
Fraction reduction(Fraction result){ //化简
if(result.down <0) { //分母为负数,令分子与分母都变为相反数
result.up=-result.up;
result.down=-result.down;
}
if(result.up == 0){ //如果分子为0
result.down=1; //令分母为1
}else { //如果分子不为0,进行约分
int d=gcd(abs(result.up),abs(result.down)); //分子分母的最大公约数
result.up /=d; //约去最大公约数
result.down /=d;
}
return result;
}
Fraction add(Fraction f1,Fraction f2){ //分数f1加上分数f2
Fraction result;
result.up=f1.up * f2.down + f2.up * f1.down; //分数和的分子
result.down = f1.down * f2.down; //分数和的分母
return reduction(result); //返回结果分数,注意化简
}
Fraction minu(Fraction f1,Fraction f2){ //分数f1减去分数f2
Fraction result;
result.up=f1.up*f2.down-f2.up*f1.down; //分数差的分子
result.down=f1.down * f2.down; //分数差的分母
return reduction(result); //返结果分数,注意化简
}
Fraction multi(Fraction f1,Fraction f2){ //分数f1乘以分数f2
Fraction result;
result.up=f1.up*f2.up; //分数积的分子
result.down=f1.down*f2.down; //分数积的分母
return reduction(result);
}
Fraction divide(Fraction f1,Fraction f2){ //分数f1除以分数f2
Fraction result;
result.up=f1.up*f2.down; //分数商的分子
result.down=f1.down*f2.up; //分数商的分母
return reduction(result);
}
void showResult(Fraction r){ //输出分数r
r=reduction(r);
if(r.up <0) printf("("); //负数则需要加上括号
if(r.down ==1) printf("%lld",r.up); //整数
else if(abs(r.up) > r.down) { //假分数,注意这里要用分子的绝对值和分母比较
printf("%lld %lld/%lld",r.up/r.down, abs(r.up)%r.down, r.down);
}else{ //真分数
printf("%lld/%lld",r.up,r.down);
}
if(r.up < 0) printf(")");
}

int main(){
//a和b结构体在外面(结构体那边)已经定义了
scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
//加法
showResult(a);//注意不能直接把a原来样子输出,有假分数情况
printf(" + ");
showResult(b);
printf(" = ");
showResult(add(a,b));
printf("\n");
//减法
showResult(a);//注意不能直接把a原来样子输出,有假分数情况
printf(" - ");
showResult(b);
printf(" = ");
showResult(minu(a,b));
printf("\n");
//乘法
showResult(a);//注意不能直接把a原来样子输出,有假分数情况
printf(" * ");
showResult(b);
printf(" = ");
showResult(multi(a,b));
printf("\n");
//除法
showResult(a);//注意不能直接把a原来样子输出,有假分数情况
printf(" / ");
showResult(b);
printf(" = ");
if(b.up == 0) printf("Inf");
else showResult(divide(a,b));
printf("\n");
system("pause");
return 0;
}