您现在的位置是:首页 >技术交流 >【id:33】【20分】C. 分数类(类与构造)网站首页技术交流
【id:33】【20分】C. 分数类(类与构造)
简介【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的最大公约数可采用辗转相除法,又称欧几里得算法,其步骤为:
- 交换a, b使a > b;
- 用a除b得到余数r,若r=0,则b为最大公约数,退出.
- 若r不为0,则用b代替a, r代替b,此时a,b都比上一次的小,问题规模缩小了;
- 继续第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);
}
加法:两个分数的分子乘对方分母相加,两个分母相乘。
减肥:两个分数的分子乘对方分母相减,两个分母相乘。
除法:分子乘以对方分母。
乘法:分子乘分子,分母乘分母。
注意输出格式!
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。