PAT-B 1034. 有理数四则运算(20)

来源:互联网 发布:英国诺丁汉大学知乎 编辑:程序博客网 时间:2024/05/18 00:52

题目链接在此。

非常规整的一道有理数的四则运算。
有理数四则运算方法看这里。

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;typedef long long LL;struct Fraction{    LL up,down;};//gcdLL gcd(LL a,LL b){    if(b == 0) return a;    else gcd(b,a%b);} //约分 Fraction reduction(Fraction a){    LL d = gcd(abs(a.up), abs(a.down));    a.up /= d;    a.down /= d;    return a;} //加法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 minu(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 multi(Fraction a, Fraction b) {    Fraction res;    res.up = a.up*b.up;    res.down = a.down * b.down;    return reduction(res);  }//除法 Fraction divide(Fraction a, Fraction b) {    Fraction res;    res.up = a.up*b.down;    res.down = a.down * b.up;    return reduction(res);  }//输出某个分数 void printFraction(Fraction a){    a = reduction(a); //对a化简;    if(a.up == 0){        printf("0");        return ;    }    if(abs(a.down) == 1){        if(a.up * a.down > 0){ //正分数             printf("%lld",abs(a.up));        }else{  //负分数             printf("(-%lld)",abs(a.up));        }        return;    }    if(abs(a.up) > abs(a.down)){        LL integer = a.up / a.down;        if(integer < 0){            printf("(%lld %lld/%lld)",integer, abs(a.up)%abs(a.down), abs(a.down));        }else{            printf("%lld %lld/%lld",integer, abs(a.up)%abs(a.down), abs(a.down));        }        return ;    }    //如果是真分数,则正常输出    if(a.up*a.down < 0){ //分数负数         printf("(-%lld/%lld)",abs(a.up), abs(a.down));    }else{ //分数为正         printf("%lld/%lld",abs(a.up),abs(a.down));    }} //输出等号后面的部分 void printRes(Fraction res){    printf(" = ");    printFraction(res);    printf("\n");} int main(){    Fraction a, b;    scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);    Fraction res;       //加法    res = add(a,b);    printFraction(a);    printf(" + ");    printFraction(b);    printRes(res);    //减法    res = minu(a,b);    printFraction(a);    printf(" - ");    printFraction(b);    printRes(res);    //乘法     res = multi(a,b);    printFraction(a);    printf(" * ");    printFraction(b);    printRes(res);     //除法    printFraction(a);    printf(" / ");    printFraction(b);    if(abs(b.up) == 0 ){        printf(" = Inf\n");    }else{        res = divide(a,b);        printRes(res);          }    return 0;}

推荐严格按照这里的模板写,否则细节处容易出错,要不就像上面的代码,出来的好多abs(),囧。

0 0
原创粉丝点击