请定义一个分数类,拥有两个整数的私有数据成员,分别表示分子和分母(分母永远为正数,符号通过分子表示)。
重载运算符加号"+",实现两个分数的相加,所得结果必须是最简分数。
输入:
第一行的两个数 分别表示 第一个分数的分子和分母(分母不为0)。 第二行的两个数 分别表示 第二个分数的分子和分母。
输出:
第一个数表示分子,第二个数表示分母(若分数代表的是整数,则不输出分母)。
输入样例:
1 5
2 5
输出样例:
3 5
我的答案:
#include<iostream>
using namespace std;
class Fenshu
{
public:
Fenshu(int a,int b):fenzi(a),fenmu(b){
}
friend Fenshu operator+(Fenshu&,Fenshu&);
friend ostream& operator<<(ostream&,Fenshu&);
private:
int fenzi;
int fenmu;
};
Fenshu operator+(Fenshu& a,Fenshu& b)
{
if(a.fenmu==b.fenmu)
{
a.fenzi+=b.fenzi;
a.fenmu=a.fenmu;
}
else
{
a.fenzi=a.fenzi*b.fenmu+b.fenzi*a.fenmu;
a.fenmu=a.fenmu*b.fenmu;
}
return a;
}
ostream& operator<<(ostream& os,Fenshu& F)
{
int i=1;
int gong=1;
if(F.fenzi==0)
{
os<<0;
}
else{
if(F.fenzi<F.fenmu)
{
for(i=1;i<=F.fenzi;i++)
{
if(F.fenzi%i==0&&F.fenmu%i==0)
gong=i;
}
F.fenzi=F.fenzi/gong;
F.fenmu=F.fenmu/gong;
if(F.fenmu==1)
{
os<<F.fenzi;
}
else os<<F.fenzi<<" "<<F.fenmu;
}
else if(F.fenzi>F.fenmu)
{
for(i=1;i<=F.fenmu;i++)
{
if(F.fenzi%i==0&&F.fenmu%i==0)
gong=i;
}
F.fenzi=F.fenzi/gong;
F.fenmu=F.fenmu/gong;
if(F.fenmu==1)
{
os<<F.fenzi;
}
else os<<F.fenzi<<" "<<F.fenmu;
}
else
{
os<<1;
}
}
return os;
}
int main()
{
int a,b;
cin>>a>>b;
Fenshu F1(a,b);
cin>>a>>b;
Fenshu F2(a,b);
Fenshu F3=F1+F2;
cout<<F3<<endl;
return 0;
}
遇到的问题:
在pta中出错:
是不是因为你最后多输出了换行符,另外如果输出是整数的话,分母不应该再输出了
修改之后
#include<iostream>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
class Fenshu
{
public:
Fenshu(int a,int b):fenzi(a),fenmu(b){
}
Fenshu operator+(Fenshu& F2)
{
Fenshu temp=*this;
temp.fenmu=fenmu*F2.fenmu;
temp.fenzi=fenmu*F2.fenzi+fenzi*F2.fenmu;
int g=gcd(temp.fenmu,temp.fenzi);
temp.fenmu/=g; temp.fenzi/=g;
return temp;
}
friend ostream& operator<<(ostream&,Fenshu&);
private:
int fenzi;
int fenmu;
};
ostream& operator<<(ostream& os,Fenshu& F)
{
int i=1;
int gong=1;
for(i=1;i<=F.fenzi;i++)
{
if(F.fenzi%i==0&&F.fenmu%i==0)
gong=i;
}
F.fenzi=F.fenzi/gong;
F.fenmu=F.fenmu/gong;
if (F.fenzi%F.fenmu!=0)
os<<F.fenzi<<" "<<F.fenmu;
else
os<<F.fenzi;
return os;
}
int main()
{
int a,b;
cin>>a>>b;
Fenshu F1(a,b);
cin>>a>>b;
Fenshu F2(a,b);
Fenshu F3=F1+F2;
cout<<F3;
return 0;
}
你题目的解答代码如下:
#include <iostream>
using namespace std;
class Fenshu
{
public:
Fenshu(int a, int b) : fenzi(a), fenmu(b)
{
}
Fenshu operator+(Fenshu &F2)
{
Fenshu temp = *this;
if (temp.fenmu == F2.fenmu)
{
temp.fenzi = fenzi + F2.fenzi;
temp.fenmu = fenmu;
}
else
{
temp.fenmu = temp.fenmu * F2.fenmu;
temp.fenzi = temp.fenzi * F2.fenmu + F2.fenzi * temp.fenmu;
}
return temp;
}
friend ostream &operator<<(ostream &, Fenshu &);
private:
int fenzi;
int fenmu;
};
ostream &operator<<(ostream &os, Fenshu &F)
{
int i = 1;
int gong = 1;
for (i = 1; i <= F.fenzi; i++)
{
if (F.fenzi % i == 0 && F.fenmu % i == 0)
gong = i;
}
F.fenzi = F.fenzi / gong;
F.fenmu = F.fenmu / gong;
os << F.fenzi;
if (F.fenmu != 1) //若分数代表的是整数,则不输出分母
os << " " << F.fenmu;
return os;
}
int main()
{
int a, b;
cin >> a >> b;
Fenshu F1(a, b);
cin >> a >> b;
Fenshu F2(a, b);
Fenshu F3 = F1 + F2;
cout << F3; //不输出换行
return 0;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
有没有可能,测试用的数据和你在dev中输入的数据不一样呢,如果能看见是哪一个测试答案错误,会很好找错误
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!