PAT乙级 1034.有理数四则运算

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
    return b==0 ? a : gcd(b,a%b);
}
ll lcm(ll a,ll b)
{
    if(a>b)
        return a/gcd(a,b)*b;
    else
        return b/gcd(b,a)*a;
}
int main()
{
	void init1(ll a1,ll b1);
    void add1(ll a1,ll b1,ll a2,ll b2);
    void decrease1(ll a1,ll b1,ll a2,ll b2);
    void mutli1(ll a1,ll b1,ll a2,ll b2);
    void divide1(ll a1,ll b1,ll a2,ll b2);
    ll a1,b1,a2,b2,z1=0,z2=0;
    scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);
    if(a1>b1)
        z1=gcd(a1,b1);
    else
        z1=gcd(b1,a1);
    a1/=z1,b1/=z1;
    if(a2>b2)
        z2=gcd(a2,b2);
    else
        z2=gcd(b2,a2);
    a2/=z2,b2/=z2;
    init1(a1,b1);
    cout<<" + ";
    init1(a2,b2);
    cout<<" = ";
    add1(a1,b1,a2,b2);
    cout<<endl;
    init1(a1,b1);
    cout<<" - ";
    init1(a2,b2);
    cout<<" = ";
    decrease1(a1,b1,a2,b2);
    cout<<endl;
    init1(a1,b1);
    cout<<" * ";
    init1(a2,b2);
    cout<<" = ";
    mutli1(a1,b1,a2,b2);
    cout<<endl;
    init1(a1,b1);
    cout<<" / ";
    init1(a2,b2);
    cout<<" = ";
    divide1(a1,b1,a2,b2);
    return 0;
}
void init1(ll a1,ll b1)
{
	if(a1==0)
        cout<<0;
    else
    {
        if(a1/b1==0)
        {
            if(a1>0&&b1>0)
                cout<<a1<<"/"<<b1;
            if(a1>0&&b1<0)
                cout<<"("<<(-1)*a1<<"/"<<(-1)*b1<<")";
            if(a1<0&&b1>0)
                cout<<"("<<a1<<"/"<<b1<<")";
            if(a1<0&&b1<0)
                cout<<a1*(-1)<<"/"<<(-1)*b1;
        }
        else
        {
            if(a1%b1==0)
            {
                if(a1/b1>0)
                    cout<<a1/b1;
                else
                    cout<<"("<<a1/b1<<")";
            }
            else
            {
                if(a1>0&&b1>0)
                    cout<<a1/b1<<" "<<a1%b1<<"/"<<b1;
                if(a1>0&&b1<0)
                    cout<<"("<<a1/b1<<" "<<a1%(b1*(-1))<<"/"<<(-1)*b1<<")";
                if(a1<0&&b1>0)
                    cout<<"("<<a1/b1<<" "<<((-1)*a1)%b1<<"/"<<b1<<")";
                if(a1<0&&b1<0)
                    cout<<a1/b1<<" "<<a1%b1<<"/"<<(-1)*b1;
            }
        }
    }
}
void add1(ll a1,ll b1,ll a2,ll b2)
{
    ll z1=lcm(b1,b2);
    ll z2=a1*z1/b1+a2*z1/b2;
    init1(z2,z1);
}
void decrease1(ll a1,ll b1,ll a2,ll b2)
{
    ll z1=lcm(b1,b2);
    ll z2=a1*z1/b1-a2*z1/b2;
    init1(z2,z1);
}
void mutli1(ll a1,ll b1,ll a2,ll b2)
{
    ll sum1=a1*a2;
    ll sum2=b1*b2;
    ll z=0;
    if(sum1>sum2)
        z=gcd(sum1,sum2);
    else
        z=gcd(sum2,sum1);
    sum1/=z,sum2/=z;
    ll z2=sum1,z1=sum2;
    init1(z2,z1);
}
void divide1(ll a1,ll b1,ll a2,ll b2)
{
    bool inf=false;
    ll sum1=a1*b2;
    ll sum2=b1*a2;
    ll z=0;
    if(sum2==0)
    	cout<<"Inf";
    else
    {
    	if(sum1>sum2)
        	z=gcd(sum1,sum2);
    	else
        	z=gcd(sum2,sum1);
    	sum1/=z,sum2/=z;
    	ll z2=sum1,z1=sum2;
    	init1(z2,z1);
    }
}

发布了45 篇原创文章 · 获赞 1 · 访问量 6777

猜你喜欢

转载自blog.csdn.net/Ls_attack/article/details/79822757
今日推荐