C++有理数类Rational

2011-01-07 17:54:54

 

 

#include <iostream>

#include <cmath>

using namespace std;

 

class Rational {

private:

int numerator;//分子

int denominator;//分母

int gcd(int i1,int i2);//求最大公约数

int lcf(int i1,int i2) const;//最小公倍数

void standardize(void);//标准化分数

public:

 

//默认构造函数(将分数初始值设为1)

Rational(void) {

numerator = 1;

denominator = 1;

}

//拷贝构造函数

Rational(const Rational& rational) {

this->numerator = rational.getNumerator();

this->denominator = rational.getDenominator();

}

Rational(int numerator, int denominator) {

this->numerator = numerator;

this->denominator = denominator;

standardize();

}

Rational(double xiaoshu);

 

//将get方法都声明Rational的const成员,供const Rational的对象调用(在运算符重载中有用到)

double getValue() const{

return (double(numerator)) / denominator;

}

int getNumerator() const{

return numerator;

}

void setNumerator(int numerator) {

this->numerator = numerator;

}

int getDenominator() const {

return denominator;

}

void setDenominator(int denominator) {

this->denominator = denominator;

}

void reduce();

friend ostream& operator<<(ostream& out,Rational& rat);

friend istream& operator>>(istream& in,Rational& rat);

friend Rational operator+(const Rational& rat1,const Rational& rat2);

friend Rational operator-(const Rational& rat1,const Rational& rat2);

friend Rational operator-(const Rational& rat);

friend Rational operator*(const Rational& rat1,const Rational& rat2);

friend Rational operator/(const Rational& rat1,const Rational& rat2);

operator float() {return this->getValue();}

};

 

Rational::Rational(double xiaoshu) {

int d = 1;

double x = abs(xiaoshu);

while((int)(x*10)/10.0 > (int)x)

{

x *= 10.0;

         d *= 10;

}

int cd = gcd((int)x, d);

numerator = (int)x / cd;

denominator = d / cd;

if (xiaoshu < 0)

numerator = -numerator;

}

 

//计算两个正整数的“最大公约数”

int Rational::gcd(int i1,int i2) {

i1 = abs(i1);

i2 = abs(i2);

int min = i1 < i2 ? i1 : i2;

int max = i1 > i2 ? i1 : i2;

for(int i=min; i > 1; i=min) {

if(min%i == 0 && max%i == 0) {

return i;

}

min = max % i;

max = i;

}

return 1;

}

 

//计算两个正整数的“最小公倍数”

int Rational::lcf(int i1,int i2) const {

i1 = abs(i1);

i2 = abs(i2);

int max = i1 > i2 ? i1 : i2;

for(int i=max; i < i1*i2; i++) {

if(i%i1 == 0 && i%i2 == 0) {

return i;

}

}

return i1*i2;

}

 

void Rational::standardize(void) {

if ((numerator < 0 && numerator*denominator > 0) || (numerator > 0 && numerator*denominator < 0)) {

numerator = -numerator;

denominator = -denominator;

}

}

 

void Rational::reduce()

{

standardize();

int cd = gcd(numerator,denominator);

numerator /= cd;

denominator /= cd;

}

 

ostream& operator<<(ostream& out,Rational& rational)

{

out << rational.getNumerator() << '/' << rational.getDenominator();

return out;

}

istream& operator>>(istream& in,Rational& rational)

{

char c;

int i1;

int i2;

cin >> i1 >> c >> i2;

rational.setNumerator(i1);

rational.setDenominator(i2);

rational.reduce();

return in;

}

 

Rational operator+(const Rational& rat1,const Rational& rat2)

{

Rational ratAdd;

int lcf = rat1.lcf(rat1.getDenominator(), rat2.getDenominator());

int i1 = lcf / rat1.getDenominator(); 

int i2 = lcf / rat2.getDenominator();

ratAdd.setNumerator(rat1.getNumerator()*i1 + rat2.getNumerator()*i2);

ratAdd.setDenominator(lcf);

ratAdd.reduce();

return ratAdd;

}

Rational operator-(const Rational& rat1,const Rational& rat2)

{

Rational ratMinus;

int lcf = rat1.lcf(rat1.getDenominator(), rat2.getDenominator());

int i1 = lcf / rat1.getDenominator(); 

int i2 = lcf / rat2.getDenominator();

ratMinus.setNumerator(rat1.getNumerator()*i1 - rat2.getNumerator()*i2);

ratMinus.setDenominator(lcf);

ratMinus.reduce();

return ratMinus;

}

Rational operator-(const Rational& rat)

{

Rational rational(-rat.getNumerator(), rat.getDenominator());

return rational;

}

Rational operator*(const Rational& rat1,const Rational& rat2)

{

Rational ratMultiply;

ratMultiply.setNumerator(rat1.getNumerator() * rat2.getNumerator());

ratMultiply.setDenominator(rat1.getDenominator() * rat2.getDenominator());

ratMultiply.reduce();

return ratMultiply;

}

Rational operator/(const Rational& rat1,const Rational& rat2)

{

Rational ratDivide;

ratDivide.setNumerator(rat1.getNumerator() * rat2.getDenominator());

ratDivide.setDenominator(rat1.getDenominator() * rat2.getNumerator());

ratDivide.reduce();

return ratDivide;

}

 

 

/*

int main(){

 

Rational f1(1,5);

Rational f2(0.4);

//运算符重载测试

Rational f3 = f1 + f2;

Rational f4 = f2 - f1;

Rational f5 = f1 * f2;

Rational f6 = f1 / f2;

//输出流运算符重载测试

cout << f3 << ' ' << f4 << ' ' << f5 << ' ' << f6 << endl;

cout << f2.getValue() << endl;

Rational rat1;

//输入流测试

cin >> rat1;

Rational rat2(-0.2);

//自定义类型转换(有理数转实数)

cout << float(-rat1) << ' ' << rat1.getValue() << endl;

//负号重载(求反)

cout << -rat2 << ' ' << rat2.getValue() << endl;

return 0;

}

*/

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值