PAT (Advanced Level) Practice 1088 Rational Arithmetic (20 分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84616234

按题意模拟即可

#include<cstdio>
using namespace std;

typedef long long ll;

ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}

void sim(ll up,ll down)
{
    int f=0;
    if(up<0) f=!f,up=-up;
    if(down<0) f=!f,down=-down;
    ll d=gcd(up,down);
    up/=d,down/=d;
    ll leave=up/down;
    up-=leave*down;
    if(f)
    {
        printf("(-");
        if(leave) printf("%lld",leave);
        if(up)
        {
            if(leave) printf(" ");
            printf("%lld/%lld",up,down);
        }
        printf(")");
    }
    else
    {
        if(leave)
        {
            printf("%lld",leave);
            if(up) printf(" %lld/%lld",up,down);
        }
        else
        {
            if(!up) printf("0");
            else printf("%lld/%lld",up,down);
        }
    }
}

ll down[2],up[2];

int main()
{
    scanf("%lld/%lld%lld/%lld",&up[0],&down[0],&up[1],&down[1]);
    ll d=gcd(down[0],down[1]);
    ll sum=down[0]/d*down[1];
    sim(up[0],down[0]);printf(" + ");sim(up[1],down[1]);printf(" = ");
    sim(sum/down[0]*up[0]+sum/down[1]*up[1],sum);puts("");

    sim(up[0],down[0]);printf(" - ");sim(up[1],down[1]);printf(" = ");
    sim(sum/down[0]*up[0]-sum/down[1]*up[1],sum);puts("");

    sim(up[0],down[0]);printf(" * ");sim(up[1],down[1]);printf(" = ");
    sim(up[0]*up[1],down[0]*down[1]);puts("");

    sim(up[0],down[0]);printf(" / ");sim(up[1],down[1]);printf(" = ");
    if(up[1]*down[0]==0) printf("Inf\n");
    else sim(up[0]*down[1],up[1]*down[0]),puts("");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Nightmare_ak/article/details/84616234
今日推荐