【PAT】1088. Rational Arithmetic

    xiaoxiao2021-03-26  29

    #define LOCAL #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> using namespace std; typedef long long ll; ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); } struct Fraction{ ll up,down; }; Fraction reduction(Fraction a){ if(a.down<0){ a.up=-a.up; a.down=-a.down; } if(a.up==0){ a.down=1; }else{ int d=gcd(abs(a.up),abs(a.down)); a.down/=d;a.up/=d; } return a; } Fraction add(Fraction a,Fraction b){ Fraction res; res.up=a.up*b.down+a.down*b.up; 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; if(b.up!=0){ res.down=a.down*b.up; res.up=a.up*b.down; return reduction(res); }else{ res.down=0; res.up=0; return res; } } Fraction sub(Fraction a,Fraction b){ Fraction res; res.up=a.up*b.down-a.down*b.up; res.down=a.down*b.down; return reduction(res); } void showResult(Fraction r){ r=reduction(r); if(r.up<0){ 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); }else{ 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); } } int main() { #ifdef LOCAL freopen("data.in","r",stdin); freopen("data.out","w",stdout); #endif // LOCAL Fraction a,b; char op[4]={'+','-','*','/'}; scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down); for(int i=0;i<4;i++){ showResult(a); printf(" %c ",op[i]); showResult(b); printf(" = "); if(op[i]=='+') showResult(add(a,b)); else if(op[i]=='-') showResult(sub(a,b)); else if(op[i]=='*') showResult(mul(a,b)); else{ if(div(a,b).down!=0) showResult(div(a,b)); else printf("Inf"); } printf("\n"); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-662609.html

    最新回复(0)