题目链接

注意

负数前面要加括号

#include<bits/stdc++.h>
using namespace std;
struct Fraction{
    int up, down;
}; 
int gcd(int a, int b){
    return b==0? a: gcd(b, a%b);
}
Fraction reduction(Fraction a){
    if(a.up == 0){
        a.down = 1;
    }else if(a.down < 0){
        a.up = -a.up;
        a.down = -a.down;
    }else{
        int d= gcd(abs(a.up), a.down);
        a.up = a.up/d;
        a.down = a.down/d;
    }

    return a;
}
void show(Fraction a){
    a = reduction(a);
    if(a.up<0) printf("(");
    if(a.down == 1) printf("%d",a.up);
    else if(abs(a.up) > a.down){
        printf("%d %d/%d", a.up/a.down,abs(a.up)%a.down,a.down);
    }else 
        printf("%d/%d",a.up%a.down,a.down);
    if(a.up<0) printf(")");
}
Fraction add(Fraction a, Fraction b){
    Fraction res;
    res.up = a.up*b.down + b.up*a.down;
    res.down = a.down * b.down;
    return reduction(res);
}
Fraction sub(Fraction a, Fraction b){
    Fraction res;
    res.up = a.up*b.down - b.up*a.down;
    res.down = a.down * b.down;
    return reduction(res);
}

Fraction mul(Fraction a, Fraction b){
    Fraction res;
    res.up = a.up * b.up;
    res.down = a.down * b.down;
    return reduction(res);
}
Fraction div(Fraction a, Fraction b){
    Fraction res;
    res.up = a.up * b.down;
    res.down = a.down * b.up;
    return reduction(res);
}

int main(){
    int a,b; 
    Fraction f1,f2,ans;
    scanf("%d/%d",&a,&b);
    f1.up = a;
    f1.down = b;
    scanf("%d/%d",&a,&b);
    f2.up = a;
    f2.down = b;
    //加 
    show(f1);
    printf(" + ");
    show(f2);
    printf(" = ");
    show(add(f1,f2));
    printf("\n");
    //减
     show(f1);
    printf(" - ");
    show(f2);
    printf(" = ");
    show(sub(f1,f2));
    printf("\n");
    //乘
    show(f1);
    printf(" * ");
    show(f2);
    printf(" = ");
    show(mul(f1,f2));
    printf("\n");
    //除
    show(f1);
    printf(" / ");
    show(f2);
    printf(" = ");
    if(f2.up == 0) printf("Inf\n");
    else {
        show(div(f1,f2));
        printf("\n"); 
    }
    return 0;
}