分数加法运算符重载

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