pat乙 1034有理数四则运算


#include<iostream>
#include<algorithm>
using namespace std;
struct Fraction{
    long long up;
    long long down;
    Fraction(){
        up=0;
        down=0;
    }
};
long long gcd(long long a,long long b)
{
    if(b==0)
    {
        return a;
    }
    else
    {
        return gcd(b,a%b);
    }
}
Fraction reduction(Fraction a)
{
    if(a.down<0)
    {
        a.down=-1*a.down;
        a.up=-1*a.up;
    }
    if(a.up==0)
    {
        a.down=1;
    }
    else
    {
        long long t=gcd(abs(a.up),abs(a.down));
        a.up=a.up/t;
        a.down=a.down/t;

    }
    return a;


}
Fraction add(Fraction a,Fraction b)
{
    Fraction c;
    c.up=a.up*b.down+b.up*a.down;
    c.down=a.down*b.down;
    return reduction(c);
}
Fraction sub(Fraction a,Fraction b)
{
    Fraction c;
    c.up=a.up*b.down-b.up*a.down;
    c.down=a.down*b.down;
    return reduction(c);
}
Fraction mul(Fraction a,Fraction b)
{
    Fraction c;
    c.up=a.up*b.up;
    c.down=a.down*b.down;
    return reduction(c);
}
Fraction div(Fraction a,Fraction b)
{
    Fraction c;
    c.up=a.up*b.down;
    c.down=a.down*b.up;
    return reduction(c);
}
int print(Fraction a)
{
    long long t=1,k=0;//测试点2,3相关,t记录括号,k记录带分数的正数部分,赋初值,long long类型,避免int溢出
    if(a.up==0)//分子为0,则输出0
    {
        cout<<'0';
        return 0;
    }
    if(a.down==0)//分母为0,输出Inf
    {
        cout<<"Inf";
        return 0;
    }

    if(a.up<0)//分子为负,输出左括号
    {
        t=a.up;
        cout<<"(";
    }

    if(abs(a.up)>=abs(a.down))//分子比分母大,计算带分数整数部分及分数部分;等于号与测试点4相关
    {
        k=a.up/a.down;
        cout<<a.up/a.down;
        a.up=a.up%a.down;
        if(k!=0&&a.up!=0)//正数不为0且分子不为0,输出一位空格
        {
            cout<<" ";
        }

    }
    if(a.up!=0)//分子不为0
    {
        if(k<0)//整数部分为负
        {
            cout<<-1*a.up<<"/"<<a.down;
        }
        else
        {
            cout<<a.up<<"/"<<a.down;
        }
    }
    if(t<0)
    {
        cout<<")";
    }
    return 0;
}
int main() {
    Fraction a,b;
    char c;
    cin>>a.up>>c>>a.down;
    cin>>b.up>>c>>b.down;
    a=reduction(a);
    b=reduction(b);
    print(a);
    cout<<" + ";
    print(b);
    cout<<" = ";
    print(add(a,b));
    cout<<endl;

    print(a);
    cout<<" - ";
    print(b);
    cout<<" = ";
    print(sub(a,b));
    cout<<endl;

    print(a);
    cout<<" * ";
    print(b);
    cout<<" = ";
    print(mul(a,b));
    cout<<endl;

    print(a);
    cout<<" / ";
    print(b);
    cout<<" = ";
    if(b.up==0)
        cout<<"Inf";
    else
        print(div(a,b));
    return 0;
}

发布了22 篇原创文章 · 获赞 0 · 访问量 259

猜你喜欢

转载自blog.csdn.net/chang_sheng1/article/details/104078289
今日推荐