publicclassRational{
publicRational():this(0,0){}
publicRational(intnumeraror,intdenominator){
if(numeraror==0||denominator==0){
this.numeraror=0;
this.denominator=0;
}else{
intn=numeraror;
intd=denominator;
if(numeraror>denominator)n=d+(d=n)*0;
intt=d/n;
if(t!=numeraror&&t!=denominator){
denominator=denominator/t;
numeraror=numeraror/t;
}
this.numeraror=numeraror;
this.denominator=denominator;
}
}
privatereadonlyintnumeraror;
privatereadonlyintdenominator;
publicintNumeraror{
get{returnnumeraror;}
}
publicintDenominator{
get{returndenominator;}
}
publicoverrideboolEquals(objectobj){
returnobjisRational?(objasRational).denominator==denominator&&(objasRational).numeraror==numeraror:false;
}
publicoverrideintGetHashCode(){
return((int)denominator^(int)(denominator>>32))^((int)numeraror^(int)(numeraror>>32));
}
publicoverridestringToString(){
returndenominator==0?"NaN":string.Format("{0}/{1}",numeraror,denominator);
}
publicstringToFloatString(){
returndenominator==0?"NaN":string.Format("{0:f5}",((float)numeraror)/denominator);
}
publicRationalAdd(Rationalr){
returnnewRational(this.Numeraror+r.Numeraror,this.Denominator+r.Denominator);
}
publicRationalSubtract(Rationalr){
returnnewRational(this.Numeraror-r.Numeraror,this.Denominator-r.Denominator);
}
publicRationalMultiply(Rationalr){
returnnewRational(this.Numeraror*r.Numeraror,this.Denominator*r.Denominator);
}
publicRationalDivide(Rationalr){
returnnewRational(r.Numeraror==0?0:this.Numeraror/r.Numeraror,r.Denominator==0?0:this.Denominator/r.Denominator);
}
publicstaticRationaloperator+(Rationalr1,Rationalr2){
returnr1.Add(r2);
}
publicstaticRationaloperator-(Rationalr1,Rationalr2){
returnr1.Subtract(r2);
}
publicstaticRationaloperator*(Rationalr1,Rationalr2){
returnr1.Multiply(r2);
}
publicstaticRationaloperator/(Rationalr1,Rationalr2){
returnr1.Divide(r2);
}
publicstaticbooloperator==(Rationalr1,Rationalr2){
returnr1.Equals(r2);
}
publicstaticbooloperator!=(Rationalr1,Rationalr2){
return!r1.Equals(r2);
}
publicstaticbooloperator>(Rationalr1,Rationalr2){
return((float)r1.Numeraror)/r1.Denominator>((float)r2.Numeraror)/r2.Denominator;
}
publicstaticbooloperator=(Rationalr1,Rationalr2){
return((float)r1.Numeraror)/r1.Denominator>=((float)r2.Numeraror)/r2.Denominator;
}
publicstaticbooloperator