分數加法運算符重載


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM