21xrx.com
2025-04-04 11:27:53 Friday
文章检索 我的文章 写文章
C++实现分数类
2023-06-27 14:17:07 深夜i     10     0
C++ 分数类 实现

在C++中实现分数类可以让我们更方便地处理分数相关的运算和业务逻辑。分数(也称有理数)是形如a/b的数,其中a和b均为整数,b不等于0。下面我们来看看如何在C++中实现分数类。

首先我们需要定义分数类的成员变量。由于分数有两个数字表示,因此我们可以使用两个整型变量分别表示分子和分母。另外,我们还需要考虑到约分的问题,在此处加入一个私有函数来求最大公约数。

class Fraction {
public:
  Fraction(int a, int b) {
    numerator = a;
    denominator = b;
    reduce();
  }
private:
  int numerator;  // 分子
  int denominator; // 分母
  // 辗转相除法求最大公约数
  int gcd(int a, int b) {
    if (b == 0)
      return a;
    
    return gcd(b, a % b);
  }
  // 约分
  void reduce() {
    int d = gcd(numerator, denominator);
    numerator /= d;
    denominator /= d;
  }
};

接下来,我们需要提供一些常用的运算符重载,例如加法、减法、乘法和除法。在C++中,我们可以使用运算符重载来实现这些运算符的重载,具体实现如下:

class Fraction {
public:
  Fraction(int a, int b) {
    numerator = a;
    denominator = b;
    reduce();
  }
  // 加法
  Fraction operator+(const Fraction& other) const {
    Fraction res(numerator * other.denominator + other.numerator * denominator, denominator * other.denominator);
    res.reduce();
    return res;
  }
  // 减法
  Fraction operator-(const Fraction& other) const {
    Fraction res(numerator * other.denominator - other.numerator * denominator, denominator * other.denominator);
    res.reduce();
    return res;
  }
  // 乘法
  Fraction operator*(const Fraction& other) const {
    Fraction res(numerator * other.numerator, denominator * other.denominator);
    res.reduce();
    return res;
  }
  // 除法
  Fraction operator/(const Fraction& other) const {
    Fraction res(numerator * other.denominator, denominator * other.numerator);
    res.reduce();
    return res;
  }
private:
  int numerator;  // 分子
  int denominator; // 分母
  // 辗转相除法求最大公约数
  int gcd(int a, int b) {
    if (b == 0)
      return a;
    
    return gcd(b, a % b);
  }
  // 约分
  void reduce() {
    int d = gcd(numerator, denominator);
    numerator /= d;
    denominator /= d;
  }
};

除此之外,我们还可以提供一些其他的方法,例如获取分子、分母、输出分数等,这些方法可以根据实际需求进行设计。

class Fraction {
public:
  Fraction(int a, int b) {
    numerator = a;
    denominator = b;
    reduce();
  }
  Fraction operator+(const Fraction& other) const {
    Fraction res(numerator * other.denominator + other.numerator * denominator, denominator * other.denominator);
    res.reduce();
    return res;
  }
  Fraction operator-(const Fraction& other) const {
    Fraction res(numerator * other.denominator - other.numerator * denominator, denominator * other.denominator);
    res.reduce();
    return res;
  }
  Fraction operator*(const Fraction& other) const {
    Fraction res(numerator * other.numerator, denominator * other.denominator);
    res.reduce();
    return res;
  }
  Fraction operator/(const Fraction& other) const {
    Fraction res(numerator * other.denominator, denominator * other.numerator);
    res.reduce();
    return res;
  }
  // 获取分子
  int getNumerator() const
    return numerator;
  
  // 获取分母
  int getDenominator() const
    return denominator;
  
  // 输出分数
  void print() const
    cout << numerator << "/" << denominator << endl;
  
private:
  int numerator;  // 分子
  int denominator; // 分母
  int gcd(int a, int b) {
    if (b == 0)
      return a;
    
    return gcd(b, a % b);
  }
  void reduce() {
    int d = gcd(numerator, denominator);
    numerator /= d;
    denominator /= d;
  }
};

最后,在使用分数类进行运算时,我们只需要使用重载后的运算符来进行即可。

Fraction a(1, 2);
Fraction b(2, 5);
Fraction c = a + b; // 分数相加
c.print();     // 输出分数

综上,C++实现分数类可以让我们更加方便地进行分数相关的运算和业务逻辑。在具体实现时,我们需要定义成员变量、运算符重载和其他常用方法,通过使用这些方法,我们可以更加方便地完成分数的计算和处理。

  
  

评论区