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