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;
}