分数加法运算符重载

1、题目:

相信同学们对复数运算符重载已经相当熟悉啦,那今天那我们来看看分数又该如何处理呢?定义一个分数类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

2、代码:

#include<iostream>
using namespace std;
class FS
{
    private:
        int fz;
        int fm;
    public:
        FS()
        {
            fm=1;
            fz=0;
        }
        void set(int m,int z)
        {
            fm=m;
            fz=z;
        }
        void del()
        {
            fm=1;
            fz=0;
        }
        FS operator + (const FS &f);
        int huajian(int,int);
        void display();
} ;

FS FS::operator +(const FS &f)
{
    FS f1;
    f1=f;
    f1.fz=fz*f1.fm+f1.fz*fm;
    f1.fm=fm*f1.fm;
    return f1;
}

int FS::huajian(int Fenz,int Fenm)
{
    while(Fenm!=0)
    {
        int temp=Fenz%Fenm;
        Fenz=Fenm;
        Fenm=temp;
    }
    return Fenz;
}

void FS::display()
{
    if(fz==0)
    {
        cout<<"0z1m"<<endl;
    }
    else
    {
        int l=huajian(fz,fm);
        fz=fz/l;
        fm=fm/l;
        if(fm<0)
        {
            fm=-1*fm;
            fz=-1*fz;
        }


        if(fz%fm!=0)
        {
            cout<<fz<<"z"<<fm<<"m"<<endl;
        }
        if(fz%fm==0)
        {
            cout<<fz<<"z"<<"1m"<<endl;
        }
    }
}

int main()
{
    FS fs;
    FS fens[100];
    string a[100];
    int n;
    cin>>n;
    int l,k;
    for(int i=0; i<2*n; i++)
    {
        cin>>a[i];
        int fm=0,fz=0;
        int o=0;
        int u=0;
        for(int j=0; j<a[i].size(); j++)
        {
            if(a[i][0]=='-')
            {
                o=1;
            }
            if(a[i][j]=='z')
            {
                l=j;
                if(a[i][l+1]=='-')
                {
                    u=1;
                }
            }

            if(a[i][j]=='m')
            {
                k=j;
            }
        }
        int count1=1,count2=1;
        if(o==1)
        {
            for(int j=l-1; j>0; j--)
            {
                fz+=(a[i][j]-'0')*count1;
                count1*=10;
            }
            fz=-1*fz;
        }
        else
        {
            for(int j=l-1; j>=0; j--)
            {
                fz+=(a[i][j]-'0')*count1;
                count1*=10;
            }
        }

        if(fz==0)
        {
            fens[i].set(0,0);
        }
        else
        {
            if(u==1)
            {
                for(int j=k-1; j>l+1; j--)
                {
                    fm+=(a[i][j]-'0')*count2;
                    count2*=10;
                }
                fm=-1*fm;
            }
            else
            {
                for(int j=k-1; j>l; j--)
                {
                    fm+=(a[i][j]-'0')*count2;
                    count2*=10;
                }
            }
            fens[i].set(fm,fz);
        }

        fs=fs+fens[i];
        if((i+1)%2==0)
        {
            fs.display();
            fs.del();
        }
    }

    return 0;
}

转载于:https://www.cnblogs.com/laixiaolian/p/5676562.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值