1.要用long long,因为中间运算可能出现超过int上限的
2.abs参数是int类型的,如果要用,用llabs
#include <cstdio>
#include <cstdlib>
typedef long long LL;
//2,3测试点卡了很久过不去,最后发现是因为abs的参数是int,如果是long long的要用llabs
LL gcd(LL a, LL b){ //辗转相除法求最大公因数
if(a < 0) a = - a;
if(b < 0) b = - b;
if(b == 0) return a;
else return gcd(b, a%b);
}
struct Fraction{ //分数结构体
LL up;
LL down;
Fraction(){};
Fraction(LL _up, LL _down){
up = _up;
down = _down;
}
};
Fraction reduction(Fraction r){ //分数化简
if(r.down < 0){
r.up = - r.up;
r.down = - r.down;
}
if(r.up == 0) r.down = 1;
else{
LL t = gcd(r.up, r.down);
r.up /= t;
r.down /= t;
}
return r;
}
Fraction add(Fraction a, Fraction b){ //分数加法
Fraction c;
c.up = a.up * b.down + a.down * b.up;
c.down = a.down * b.down;
return reduction(c);
}
Fraction minus(Fraction a, Fraction b){ //分数减法
Fraction c;
c.up = a.up * b.down - a.down * b.up;
c.down = a.down * b.down;
return reduction(c);
}
Fraction multi(Fraction a, Fraction b){ //分数乘法
Fraction c;
c.up = a.up * b.up;
c.down = a.down * b.down;
return reduction(c);
}
Fraction divide(Fraction a, Fraction b){ //分数除法
Fraction c;
c.up = a.up * b.down;
c.down = a.down * b.up;
return reduction(c);
}
void show(Fraction a){ //输出一个分数
a = reduction(a);
if(a.down == 0){
printf("Inf");
return;
}
if(a.up < 0) printf("(");
if(a.down == 1) printf("%lld", a.up);
else if(llabs(a.up) > a.down) printf("%lld %lld/%lld", a.up / a.down, llabs(a.up) % a.down, a.down);
else printf("%lld/%lld", a.up, a.down);
if(a.up < 0) printf(")");
}
int main(){
LL a, b, c, d;
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
Fraction f1 = Fraction(a, b), f2 = Fraction(c, d);
Fraction out[4] = {add(f1, f2), minus(f1, f2), multi(f1, f2), divide(f1, f2)};
char s[] = {'+', '-', '*', '/'};
for(int i = 0; i < 4; i++){
show(f1), printf(" %c ", s[i]), show(f2), printf(" = "), show(out[i]);
if(i < 3) printf("\n");
}
return 0;
}