#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;
}
pat乙 1034有理数四则运算
猜你喜欢
转载自blog.csdn.net/chang_sheng1/article/details/104078289
今日推荐
周排行