分数加法运算重载

题目:

相信同学们对复数运算符重载已经相当熟悉啦,那今天那我们来看看分数又该如何处理呢?定义一个分数类FS,有私有成员分子fz,分母fm。另有公有成员函数FS operator + (const FS &f)对运算符“+”进行重载,实现两个分数相加。题目首先给出一个整型数n,紧跟着2n行输入,输入形如3z4m,代表分子为3,分母为4。其中分母不为0,输入时分母可以为负数,但输出时分母必须为正数。 要求对分数进行两两求和,并化简。(备注说明:分数为0时,表示成0z1m,如果结果为负数,那么分子取负数,分母为正数)

示例如下:

输入:

3

4z9m

2z9m

4z5m

5z4m

2z-5m

1z-5m

输出:

2z3m

41z20m

-3z5m

代码:

#include <iostream>
#include <cmath>
//#define SIZE 20
class FS;
using namespace std;
int  minfm(int x, int y);
int location(string n,char a){        //找出'm' 'z' 位置
    for (int i = 0; i < n.length();i++){
        if(n[i]==a){
            return i;
        }
    }
}
void fzfm(FS &f, int l, int r);
class FS{
    string a;
public:
    int fz=0, fm=0;
    FS() {}
    friend istream &operator >>(istream &is,FS &f){   //输入重载
            is >> f.a;
            return is;
    }
    friend void operator +(FS &f1,FS &f2){       //相加结果储存在第一个FS类中
        int left, right;
        //int fz1, fz2, fm1, fm2;
        left = location(f1.a, 'z');     //'z'的位置
        right = f1.a.length() - 1;      //'m'的位置
        fzfm(f1, left, right);          ////求出分子分母(转为int型
        left = location(f2.a, 'z');
        right = f2.a.length() - 1;
        fzfm(f2, left, right);
        addSimple(f1, f2);
    }
    friend void fzfm(FS &f, int l, int r);
    friend void addSimple(FS &f1, FS &f2);
    friend int minfm(int x, int y);
};
void addSimple(FS &f1, FS &f2){    //求和+化简
    int temp = abs(f1.fm * f2.fm /minfm(f1.fm, f2.fm)); //最小公倍数
    //int temp1 = f1.fm * f2.fm / temp;
    if(f1.fm<0){                   //分母符号转到分子
        f1.fm = -f1.fm;         
        f1.fz = -f1.fz;
    }
    if(f2.fm<0){
        f2.fm = -f2.fm;
        f2.fz = -f2.fz;
    }
    f1.fz *= temp / f1.fm;        //通分
    f2.fz *= temp / f2.fm;
    f1.fz += f2.fz;               //分子相加并化简
    f1.fm = temp;                 
    temp = minfm(f1.fz, temp);    
    f1.fz /= temp;
    f1.fm /= temp;                //
}
int minfm(int x,int y){ //最大公约数
    int temp=x%y;
    //int _x = x, _y = y;
    while(temp){      
        x = y;
        y = temp;
        temp = x % y;
    }
    return abs(y);
}
void fzfm(FS &f,int l,int r){  //求出分子分母(int 型
    //int sum = 0;
    for (int i = l - 1,k=1; i >= 0;i--,k*=10){
        if(f.a[i]=='-')
         f.fz = -f.fz;
        else
            f.fz += (f.a[i] - '0') * k;
    }
    for (int i = r - 1,k=1; i >l;i--,k*=10){
        if(f.a[i]=='-')
            f.fm = -f.fm;
        else
            f.fm += (f.a[i] - '0') * k;
    }
}
int main(){
    int n;
    cin >> n;
    FS fs[2 * n];
    for (int i = 0; i < n;i++){
        cin >> fs[2 * i] >> fs[2 * i + 1];
        fs[2 * i] + fs[2 * i + 1];
    }
    for (int i = 0; i < n;i++)
        cout << fs[2 * i].fz << "z" << fs[2 * i].fm << "m" << endl;
}   
上一篇:clementine for Mac(多平台音乐管理播放软件)


下一篇:Python 之logging