题目描述
完成下列分数类的实现:
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
第一组第一个分数
第一组第二个分数
第二组第一个分数
第二组第二个分数
......
输出
第一组两个分数的和
第一组两个分数的差
第一组两个分数的积
第一组两个分数的商
第二组两个分数的和
第二组两个分数的差
第二组两个分数的积
第二组两个分数的商
......
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class CFraction
{
private:
int fz; int 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(int a,int b); // 求对象的分子和分母的最大公约数
//void print();
};
CFraction::CFraction(int fz_val, int fm_val)//分子分母
{
fz = fz_val;
fm = fm_val;
}
CFraction CFraction::add(const CFraction& r)//加
{
int a = 0,b=0;
a = fz * r.fm+r.fz*fm;
b = fm * r.fm;
getGCD(a,b);
return r;
}
CFraction CFraction::sub(const CFraction& r)//减
{
int a = 0, b = 0;
a = fz * r.fm -r.fz * fm;
b = fm * r.fm;
getGCD(a, b);
return r;
}
CFraction CFraction::mul(const CFraction& r)//乘
{
int a = 0, b = 0;
a = fz * r.fz ;
b = fm * r.fm;
getGCD(a, b);
return r;
}
CFraction CFraction::div(const CFraction& r)//除
{
int a = 0, b = 0;
a = fz * r.fm;
b = fm * r.fz;
getGCD(a, b);
return r;
}
int CFraction::getGCD(int a,int b)
{
int fza = a;
int fmb = b;
int swap=0,r=0,fzo=0,fmo=0,y=0,flage=0;//y最大公约数
if (a < b)//交换
{
swap = a;
a = b;
b = swap;
swap = 0;
}
begin:
r = a % b;
if (r == 0)
{
y = b;
if (y < 0)
{
y = y * (-1);
}
}
else
{
a = b;
b = r;
goto begin;
}
fzo = fza / y;
fmo = fmb / y;
cout << fzo << '/' << fmo << endl;
return 0;
}
int main()
{
int t = 0,a=0,b=0;
char m;
cin >> t;
while (t--)
{
cin >> a >> m>>b;
CFraction p1(a, b);
cin >> a>> m >>b;
CFraction p2(a, b);
p1.add(p2);
p1.sub(p2);
p1.mul(p2);
p1.div(p2);
cout << endl;
}
return 0;
}