zoukankan      html  css  js  c++  java
  • 分数加法运算重载

    题目:

    相信同学们对复数运算符重载已经相当熟悉啦,那今天那我们来看看分数又该如何处理呢?定义一个分数类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;
    }   
    
  • 相关阅读:
    互联网广告综述之点击率特征工程
    强大的矩阵奇异值分解(SVD)
    xgboost原理
    《转》八大算法详细讲解
    sklearn中的回归器性能评估方法
    sklearn中的损失函数
    sklearn参数优化方法
    sklearn中的数据集的划分
    sklearn数据预处理
    九宫格布局
  • 原文地址:https://www.cnblogs.com/pluie/p/12960557.html
Copyright © 2011-2022 走看看