利用符号位对分数进行简化
#include<iostream>
#include<cstdlib>
using namespace std;
class Rational{
private:
int x,y;
public:
void simplify();
Rational(int a=0,int b=0):x(a),y(b)
{
simplify();
}
friend Rational Add(Rational &r1,Rational &r2);
friend Rational Subtract(Rational &r1,Rational &r2);
friend Rational Multiply(Rational &r1,Rational &r2);
friend Rational Divide(Rational &r1,Rational &r2);
void print() {cout<<x<<"/"<<y<<endl;}
};
int gcd(int x, int y) {return x % y == 0 ? y : gcd(y, x % y);}
int lcm(int x, int y) {return x / gcd(x, y) * y;}
Rational Add(Rational &r1,Rational &r2)
{
Rational r3;
int tempVal = lcm(r1.y, r2.y);
r1.x *= tempVal / r1.y;
r2.x *= tempVal / r2.y;
r1.y = r2.y = tempVal;
r3.x=r1.x+r2.x;
r3.y=tempVal;
r1.simplify();
r2.simplify();
r3.simplify();
return r3;
}
Rational Subtract(Rational &r1,Rational &r2)
{
Rational r3;
int tempVal = lcm(r1.y, r2.y);
r1.x *= tempVal / r1.y;
r2.x *= tempVal / r2.y;
r1.y = r2.y = tempVal;
r3.x=r1.x-r2.x;
r3.y=tempVal;
r1.simplify();
r2.simplify();
r3.simplify();
return r3;
}
Rational Multiply(Rational &r1,Rational &r2)
{
Rational r3;
r3.x=r1.x*r2.x;
r3.y=r1.y*r2.y;
r3.simplify();
return r3;
}
Rational Divide(Rational &r1,Rational &r2)
{
Rational r3;
r3.x=r1.x*r2.y;
r3.y=r1.y*r2.x;
r3.simplify();
return r3;
}
void Rational::simplify()
{
int m,n,r,s=1;
if(x!=0&&y!=0){
if(x<0) {s*=-1; x=-x;}
if(y<0) {s*=-1; y=-y;}
m=x;n=y;
int tempVal = gcd(x, y);
x /= tempVal;
y /= tempVal;
}
else x=0,y=1;
}
int main()
{
Rational r1(1,3),r2(7,8),r3;
r1.print();
r2.print();
r3=Add(r1,r2);
cout<<"1/3 + 7/8=";r3.print();
r3=Subtract(r1,r2);
cout<<"1/3 - 7/8=";r3.print();
r3=Multiply(r1,r2);
cout<<"1/3 * 7/8=";r3.print();
r3=Divide(r1,r2);
cout<<"1/3 / 7/8=";r3.print();
}