#include <iostream>
using namespace std;
long long int gcd(long long int m,long long int n)
{
if(n==0)
return m;
else
return gcd(n,m%n);
}
void outputStandard(long long int a,long long int b)
{
bool isNegative=false;
if(a<0&&b>0||(a>0&&b<0))
{
cout<<"(-";
isNegative=true;
a=abs(a);
b=abs(b);
}
long long int G=gcd(a,b);
a/=G;
b/=G;
if(b==1)
cout<<a;
else if(a>b)
cout<<a/b<<" "<<a%b<<"/"<<b;
else
cout<<a%b<<"/"<<b;
if(isNegative)
cout<<")";
}
void compute(long long int a1,long long int b1,long long int a2,long long int b2,char sign)
{
//求绝对值
bool isNegative1=false,isNegative2=false;
if(a1<0)
{
a1=-a1;
isNegative1=true;
}
if(a2<0)
{
a2=-a2;
isNegative2=true;
}
//约分
long long int G=gcd(a1,b1);
a1/=G;
b1/=G;
G=gcd(a2,b2);
a2/=G;
b2/=G;
if(isNegative1==true)
a1=-a1;
if(isNegative2==true)
a2=-a2;
if(sign=='+')
{
a1=a1*b2+a2*b1;
b1=b1*b2;
}
else if(sign=='-')
{
a1=a1*b2-a2*b1;
b1=b1*b2;
}
else if(sign=='*')
{
a1=a1*a2;
b1=b1*b2;
}
else if(sign=='/')
{
if(a2==0)
{
cout<<"Inf";
return ;
}
a1=a1*b2;
b1=b1*a2;
}
outputStandard(a1,b1);
}
int main()
{
long long int a1,b1,a2,b2;
scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);
outputStandard(a1,b1);
cout<<" + ";
outputStandard(a2,b2);
cout<<" = ";
compute(a1,b1,a2,b2,'+');
cout<<endl;
outputStandard(a1,b1);
cout<<" - ";
outputStandard(a2,b2);
cout<<" = ";
compute(a1,b1,a2,b2,'-');
cout<<endl;
outputStandard(a1,b1);
cout<<" * ";
outputStandard(a2,b2);
cout<<" = ";
compute(a1,b1,a2,b2,'*');
cout<<endl;
outputStandard(a1,b1);
cout<<" / ";
outputStandard(a2,b2);
cout<<" = ";
compute(a1,b1,a2,b2,'/');
cout<<endl;
return 0;
}
这题与PAT1081 类似,都是要用到辗转相除法求最大公约数的知识点的。
两题的思路也是类似,在进行分数的运算之前,先对分数进行约分,之后再进行运算。