您现在的位置是:首页 >技术教程 >【id:33】【20分】C. 分数类(类与构造)网站首页技术教程

【id:33】【20分】C. 分数类(类与构造)

Z1Jxxx 2023-07-18 00:00:02
简介【id:33】【20分】C. 分数类(类与构造)


一、题目描述

完成下列分数类的实现:

class CFraction
{
private:
int fz, fm;
public:
CFraction(int fz_val, int fm_val) ;
CFraction add(const CFraction &r);
CFraction sub(const CFraction &r);
CFraction mul(const CFraction &r);
CFraction div(const CFraction &r);
int getGCD(); // 求对象的分子和分母的最大公约数
void print();
};

求两数a、b的最大公约数可采用辗转相除法,又称欧几里得算法,其步骤为:

  1. 交换a, b使a > b;
  2. 用a除b得到余数r,若r=0,则b为最大公约数,退出.
  3. 若r不为0,则用b代替a, r代替b,此时a,b都比上一次的小,问题规模缩小了;
  4. 继续第2步。

注意:如果分母是1的话,也按“分子/1”的方式输出。


二、输入与输出

1.输入

测试数据的组数 t

第一组第一个分数

第一组第二个分数

第二组第一个分数

第二组第二个分数

3
1/2
2/3
3/4
5/8
21/23
8/13

2.输出

第一组两个分数的和

第一组两个分数的差

第一组两个分数的积

第一组两个分数的商

第二组两个分数的和

第二组两个分数的差

第二组两个分数的积

第二组两个分数的商

7/6
-1/6
1/3
3/4

11/8
1/8
15/32
6/5

457/299
89/299
168/299
273/184

三、参考代码

#include<iostream>
#include<cmath>
#include<string>
using namespace std;
class CF
{
private:
     int fz, fm;
public:
     CF(int fz1, int fm1) ;
     CF add(const CF &r);//加 
     CF sub(const CF &r);//减 
     CF mul(const CF &r);//乘 
     CF div(const CF &r);//除 
     void print();
};
CF::CF(int fz1,int fm1)
{
	fz=fz1;
	fm=fm1;
}
CF CF::add(const CF &r)
{
	return CF(fz*r.fm+fm*r.fz,fm*r.fm);
}
CF CF::sub(const CF &r)
{
	return CF(fz*r.fm-fm*r.fz,fm*r.fm);
}
CF CF::mul(const CF &r)
{
	return CF(fz*r.fz,fm*r.fm);
}
CF CF::div(const CF&r)
{
	return CF(fz*r.fm,fm*r.fz);
}
int gcd(int a,int b)   // 求对象的分子和分母的最大公约数
{
	if(a<b)
	{
		int temp=a;
		a=b;
		b=temp;
	}
	
	if(a%b==0)
	{
		return b;
	}
	else return gcd(b,a%b);
};
void CF::print()
{
	int z=gcd(fz,fm);
	fz /=z;
	fm /=z;
	string ch;
	if(fz*fm>0)
	{
		ch="";
	}
	else ch="-";
	
	cout<<ch<<fz<<"/"<<fm<<endl;
	
}
int main()
{
	int num;
	cin>>num;
	char c;
	int fz1,fm1,fz2,fm2;
	while(num--)
	{
		cin>>fz1>>c>>fm1>>fz2>>c>>fm2;
		CF num1(fz1,fm1);
		CF num2(fz2,fm2);
		CF num3=num1.add(num2);
		num3.print();
		num3=num1.sub(num2);
		num3.print();
		num3=num1.mul(num2);
		num3.print();
		num3=num1.div(num2);
		num3.print();
		
	}
	return 0;
}

四、题解思路

辗转相除法

// 辗转相除法(一定要保证a>b)
int gcd(int a,int b)
{
	if(a<b)
	{
		int temp=a;
		a=b;
		b=temp;
	}
	if(a % b == 0)
		return b;
	else
		return gcd(b ,a % b);
}

加法:两个分数的分子乘对方分母相加,两个分母相乘。
减肥:两个分数的分子乘对方分母相减,两个分母相乘。
除法:分子乘以对方分母。
乘法:分子乘分子,分母乘分母。
注意输出格式!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。