1034 有理数四则运算

这是一种套路题,需要记住大体流程,然后反复练习。

注意点:

因为题目给出的整数可能超过int范围,所以整数都必须用long long型存放,不然最后两个测试点过不去。

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
struct  Fraction {
    LL fenzi,fenmu;
};
LL gcd(LL a,LL b) { //这里必须用long long类型,因为给出的分子分母可能超出int,导致测试点3,4无法通过 
    return b == 0?a:gcd(b,a%b);
}
Fraction reduction(Fraction a) {//化简
    if(a.fenmu < 0) {//分母是负数,分子分母全部取反
        a.fenzi = -a.fenzi;
        a.fenmu = -a.fenmu;
    }
    if(a.fenzi == 0) a.fenmu = 1;//分数是0,就令分子为0,分母为1
    else {//求出分子和分母绝对值的最大公约数 d
        LL d = gcd(abs(a.fenzi),abs(a.fenmu));
        a.fenzi /= d;
        a.fenmu /= d;
    }
    return a;
}
//加法
Fraction add(const Fraction& a,const Fraction& b) {
    Fraction c;
    c.fenzi = a.fenzi*b.fenmu+a.fenmu*b.fenzi;
    c.fenmu = a.fenmu*b.fenmu;
    return reduction(c);
}
//减法
Fraction sub(const Fraction& a,const Fraction& b) {
    Fraction c;
    c.fenzi = a.fenzi*b.fenmu - a.fenmu*b.fenzi;
    c.fenmu = a.fenmu*b.fenmu;
    return reduction(c);
}
//乘法
Fraction muti(const Fraction& a,const Fraction& b) {
    Fraction c;
    c.fenzi = a.fenzi*b.fenzi;
    c.fenmu = a.fenmu*b.fenmu;
    return reduction(c);
}
//除法
Fraction divide(const Fraction& a,const Fraction& b) {
    Fraction c;
    c.fenzi = a.fenzi*b.fenmu;
    c.fenmu = a.fenmu*b.fenzi;
    return reduction(c);
}
//打印输出 
void print(Fraction a) {
    if(a.fenzi < 0) printf("(");
    if(a.fenmu == 1) printf("%lld",a.fenzi);//如果是整数,即分母为1 
    else if(abs(a.fenzi) > a.fenmu) printf("%lld %lld/%lld",a.fenzi/a.fenmu,abs(a.fenzi)%a.fenmu,a.fenmu);//如果是假分式
    else printf("%lld/%lld",a.fenzi,a.fenmu);//如果是真分式
    if(a.fenzi < 0) printf(")");
}

int main() {
    Fraction a,b;
    scanf("%lld/%lld %lld/%lld",&a.fenzi,&a.fenmu,&b.fenzi,&b.fenmu);
    a = reduction(a);//化简a
    b = reduction(b);//化简b
    //加法
    print(a);
    printf(" + ");
    print(b);
    printf(" = ");
    print(add(a,b));
    printf("\n");
    //减法
    print(a);
    printf(" - ");
    print(b);
    printf(" = ");
    print(sub(a,b));
    printf("\n");
    //乘法
    print(a);
    printf(" * ");
    print(b);
    printf(" = ");
    print(muti(a,b));
    printf("\n");
    //除法
    print(a);
    printf(" / ");
    print(b);
    printf(" = ");
    if(b.fenzi == 0) printf("Inf");
    else print(divide(a,b));
    printf("\n");
    return 0;
}

 

posted @ 2020-02-18 16:36  tangq123  阅读(155)  评论(0编辑  收藏  举报