C. 分数类(类与构造)

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”的方式输出。


输入

测试数据的组数 t

第一组第一个分数

第一组第二个分数

第二组第一个分数

第二组第二个分数

......


输出

第一组两个分数的和

第一组两个分数的差

第一组两个分数的积

第一组两个分数的商

第二组两个分数的和

第二组两个分数的差

第二组两个分数的积

第二组两个分数的商

......


输入样例1 
3
1/2
2/3
3/4
5/8
21/23
8/13
输出样例1
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<vector>
#include<queue>
#include<cstring>
#include<set>
#include<algorithm>
#include<cmath>
#include<stack>
#include<iomanip>
#include<cstdio>
using namespace std;
typedef unsigned long long ll;

int z,m;

int gcd(int a,int b)
{
	if(a<0)//求最大公约数避免有负数出现
	{
		a=-a;
	}
	if(b<0)
	{
		b=-b;
	}
	if(a%b==0)
	{
		return b;
	}
	else
	{
		return gcd(b,a%b);
	}
}

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

void CFraction::print()
{
	if(fz>0&&fm<0)//避免负号在分母上
	{
		fz=-fz;
		fm=-fm;
	}
	cout<<fz/(gcd(fz,fm))<<"/"<<fm/(gcd(fz,fm))<<endl;//约分后输出
}

CFraction CFraction::add(const CFraction &r)//加法
{
	 z=fz*r.fm+fm*r.fz;
	 m=fm*r.fm;//数学知识
	CFraction t(z,m);
	return t;
}

CFraction CFraction::sub(const CFraction &r)//减法
{
	if(fm==r.fm)//分母相等的情况
	{
		CFraction t(fz-r.fz,fm);
		return t;		
	}
	 m=(fm*r.fm)/gcd(fm,r.fm);//最小公倍数
	 z=fz*(m/fm)-r.fz*(m/r.fm);//通分 
	CFraction t(z,m);
	return t;	 
}

CFraction CFraction::mul(const CFraction &r)//乘法(分子乘分子,分母乘分母即可)记得乘完之后也要约分
{
	CFraction t((fz*r.fz)/gcd(fz*r.fz,fm*r.fm),(fm*r.fm)/gcd(fz*r.fz,fm*r.fm));
	return t;	 
}

CFraction CFraction::div(const CFraction &r)//除法,同上乘法(只是调一下位置)
{
	
	CFraction t((fz*r.fm)/gcd(fz*r.fm,fm*r.fz),(fm*r.fz)/gcd(fz*r.fm,fm*r.fz));
	return t;	 
}
CFraction::CFraction(int fz_val, int fm_val)
{
	fz=fz_val;
	fm=fm_val;
}

int CFraction::getGCD()
{
	int z=fz;
	int m=fm;
	if(z<m)
	{
		int t=z;
		z=m;
		m=t;
	}
	if(z<0)
	{
		z=-z;
	}
	if(m<0)
	{
		m=-m;
	}
	while(1)
	{
		if(z%m==0)
		{
			return m;
		}
		else
		{
			int r=z%m;
			z=m;
			m=r;
		}
	}
}


int main()
{
	int t,fz1,fz2,fm1,fm2;
	char noth;
	cin>>t;
	while(t--)
	{
		cin>>fz1>>noth>>fm1;
		CFraction num1(fz1,fm1);
		cin>>fz2>>noth>>fm2;
		CFraction num2(fz2,fm2);
		CFraction ans=num1.add(num2);
		ans.print();
		ans=num1.sub(num2);
		ans.print();	
		ans=num1.mul(num2);
		ans.print();
		ans=num1.div(num2);	
		ans.print();
		cout<<endl;//格式化输出
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZZWWWFFF_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值