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;

}

*/

下面是一个简单的C++实现Rational的代码,包括了常见的运算符重载和一些基本的操作: ```c++ #include <iostream> #include <cmath> using namespace std; class Rational { public: Rational(int numerator = 0, int denominator = 1) : numerator_(numerator), denominator_(denominator) {} Rational(const Rational& other) : numerator_(other.numerator_), denominator_(other.denominator_) {} // 加法运算符重载 Rational operator+(const Rational& other) const { int new_numerator = numerator_ * other.denominator_ + other.numerator_ * denominator_; int new_denominator = denominator_ * other.denominator_; return Rational(new_numerator, new_denominator); } // 减法运算符重载 Rational operator-(const Rational& other) const { int new_numerator = numerator_ * other.denominator_ - other.numerator_ * denominator_; int new_denominator = denominator_ * other.denominator_; return Rational(new_numerator, new_denominator); } // 乘法运算符重载 Rational operator*(const Rational& other) const { int new_numerator = numerator_ * other.numerator_; int new_denominator = denominator_ * other.denominator_; return Rational(new_numerator, new_denominator); } // 除法运算符重载 Rational operator/(const Rational& other) const { int new_numerator = numerator_ * other.denominator_; int new_denominator = denominator_ * other.numerator_; return Rational(new_numerator, new_denominator); } // 等于运算符重载 bool operator==(const Rational& other) const { return numerator_ * other.denominator_ == denominator_ * other.numerator_; } // 不等于运算符重载 bool operator!=(const Rational& other) const { return !(*this == other); } // 大于运算符重载 bool operator>(const Rational& other) const { return numerator_ * other.denominator_ > denominator_ * other.numerator_; } // 小于运算符重载 bool operator<(const Rational& other) const { return numerator_ * other.denominator_ < denominator_ * other.numerator_; } // 大于等于运算符重载 bool operator>=(const Rational& other) const { return !(*this < other); } // 小于等于运算符重载 bool operator<=(const Rational& other) const { return !(*this > other); } // 转换为double型 double to_double() const { return (double)numerator_ / denominator_; } // 约分操作 void reduce() { int gcd = abs(__gcd(numerator_, denominator_)); numerator_ /= gcd; denominator_ /= gcd; } // 转换为字符串形式 string to_string() const { reduce(); if (denominator_ == 1) { return std::to_string(numerator_); } else { return std::to_string(numerator_) + "/" + std::to_string(denominator_); } } // 输入流运算符重载 friend istream& operator>>(istream& in, Rational& r) { in >> r.numerator_ >> r.denominator_; return in; } // 输出流运算符重载 friend ostream& operator<<(ostream& out, const Rational& r) { out << r.to_string(); return out; } private: int numerator_; // 分子 int denominator_; // 分母 }; ``` 上述代码中,我们定义了一个Rational,它包含了两个成员变量numerator和denominator,分别表示有理数的分子和分母。我们还定义了一些基本的运算符重载函数,包括加、减、乘、除、等于、不等于、大于、小于、大于等于和小于等于运算符。Rational还实现了一些基本的操作,如转换为double型、约分操作和转换为字符串形式等。其中,我们使用了C++11标准中的__gcd函数来求最大公约数。最后,我们还实现了输入输出流运算符重载函数,使得我们可以方便地使用cin和cout来输入输出Rational型的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值