C++之運算符重載(分數的運算)

今天在小甲魚老師的視頻中學到了運算符重載知識,並通過實例進行了講解,先將源代碼向大家分享

至今扔沒有完全搞懂歐幾里得的具體原理,歡迎大家多多交流。

部分轉載:http://blog.csdn.net/zjsxzjb/article/details/6262667

求兩個數的最大公約數:

(1)迭代版本

int ITERATIVE-GCD(int a, int b) {  
   int r = a % b;  
   while (r) {  
     a = b;  
     b = r;  
     r = a % b;  
   }  
   return b;  
}    
(2)遞歸版本

int RECURSIVE-GCD(int a, int b) {  
   if (b == 0) return a; else return RECURSIVE-GCD(b, a % b);  
}

(3)運算符重載

#include <iostream>
#include <cmath>
#include <stdlib.h>

using namespace std;

class Rational
{
public:
    Rational(int num,int denomi);

    Rational operator+(Rational x);//運算符重載
    Rational operator-(Rational x);
    Rational operator*(Rational x);
    Rational operator/(Rational x);

    void print();
private:
    int numerator;//分子
    int denominator;//分母

    void normalize();//歸一化處理,比如將2/16變成1/8

};

Rational::Rational(int num,int denomi)
{
    numerator=num;
    denominator=denomi;

    normalize();
}

void Rational::normalize()
{
   if(denominator<0)
   {
       numerator=-numerator;
       denominator=-denominator;
   }
//歐幾里得算法
    int a = abs(numerator);
    int b = abs(denominator);
//求兩個數的最大公約數
    while(b>0)
    {
      int t=a%b;
      a=b;
      b=t;
    }
//分子,分母分別除以最大公約數,得到最簡式子
    numerator/=a;
    denominator/=a;

}
//a    c   a*d+b*c
//—  + — = ——————
//b    d     b*d
Rational Rational::operator+(Rational x)
{
 int a=numerator;
 int b=denominator;
 int c=x.numerator;
 int d=x.denominator;

 int e=a*d+c*b;
 int f=b*d;
 return Rational(e,f);
}

Rational Rational::operator-(Rational x)
{
    x.numerator=-x.numerator;//減相當於加負數

    return operator+(x);
}
//a    c     a*c
//—  * — = ——————
//b    d     b*d
Rational Rational::operator*(Rational x)
{
    int a=numerator;
    int b=denominator;
    int c=x.numerator;
    int d=x.denominator;

    int e=a*c;
    int f=b*d;

    return Rational(e,f);
}
//a    c     a*d
//—  / — = ——————
//b    d     b*c
Rational Rational::operator/(Rational x)
{
    int a=numerator;
    int b=denominator;
    int c=x.numerator;
    int d=x.denominator;

    int e=a*d;
    int f=b*c;

    return Rational(e,f);
}

void Rational::print()
{
    if(numerator%denominator==0)
        cout<<numerator/denominator;
    else
        cout<<numerator<<'/'<<denominator;
}
int main()
{
Rational f1(2,16);
Rational f2(7,8);

Rational resadd=f1+f2;
f1.print();
cout<<'+';
f2.print();
cout<<'=';
resadd.print();
cout<<'\n';

Rational ressub=f1-f2;
f1.print();
cout<<'-';
f2.print();
cout<<'=';
ressub.print();
cout<<'\n';


Rational resmul=f1*f2;
f1.print();
cout<<'*';
f2.print();
cout<<'=';
resmul.print();
cout<<'\n';


Rational resc=f1/f2;
f1.print();
cout<<'/';
f2.print();
cout<<'=';
resc.print();
cout<<'\n';

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章