分数加法运算符重载
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;
}