您的位置:首页 > 其它

1034. 有理数四则运算

2016-03-30 17:36 232 查看
题目是pat乙级

思路:构造一个分数类,这样可以把各种算法分开编写,降低编写难度。

训练目的:类 运算符重载
题目描述 

本题要求编写程序,计算2个有理数的和、差、积、商。

输入格式:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。

输出格式:

分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。
输入样例1:
2/3 -4/2

输出样例1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

输入样例2:
5/3 0/6

输出样例2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf


参考代码

#include <iostream>
using namespace std;
long long gcd(long long m,long long n)
{
long long r;
for(r=m%n;r;r=m%n)
{
m=n;
n=r;
}
return n;
}
struct fenshu
{
int flag;
long long  fenzi;
long long  fenmu;
void yuefen()
{
if(fenzi==0||fenmu==0) return;
long long g=gcd(fenmu,fenzi);
fenmu/=g;
fenzi/=g;
}
fenshu & operator=(const fenshu & other)
{
flag=other.flag;
fenzi=other.fenzi;
fenmu=other.fenmu;
return *this;
}
};

istream &operator>>(istream & in,fenshu &fen)
{
char ch;
in>>fen.fenzi>>ch>>fen.fenmu;
if (fen.fenzi<0) fen.flag=-1,fen.fenzi=-fen.fenzi; else fen.flag=1;
fen.yuefen();
return in;
}
ostream &operator<<(ostream &out,const fenshu &fen)
{
if(fen.fenmu==0)
{
out<<"Inf";
return out;
}
if (fen.flag==-1)
out<<"(-";
if(fen.fenzi%fen.fenmu==0)
{
out<<fen.fenzi/fen.fenmu;
}
else
{
if(fen.fenzi>=fen.fenmu)
out<<fen.fenzi/fen.fenmu<<" ";
out<<fen.fenzi%fen.fenmu<<"/"<<fen.fenmu;
}
if (fen.flag==-1)
out<<")";
return out;
}
fenshu operator +(fenshu &f1,fenshu & f2)
{
fenshu f;
if (f1.flag==f2.flag)
{
f.flag=f1.flag;
f.fenmu=f1.fenmu*f2.fenmu;
f.fenzi=f1.fenmu*f2.fenzi+f1.fenzi*f2.fenmu;

}
else //if(f1.flag!=f2.flag)
{
f.fenmu=f1.fenmu*f2.fenmu;
f.fenzi=f1.fenzi*f2.fenmu-f2.fenzi*f1.fenmu;
if (f.fenzi>=0)
f.flag=f1.flag;
else
{
f.flag=f2.flag;
f.fenzi=-f.fenzi;
}
}
f.yuefen();
return f;
}
fenshu operator -(fenshu &f1,fenshu &f2)
{
fenshu tf=f2;
tf.flag=-tf.flag;
return f1+tf;
}
fenshu operator *(fenshu &f1,fenshu &f2)
{
fenshu f;
f.flag=f1.flag*f2.flag;
f.fenzi=f1.fenzi*f2.fenzi;
f.fenmu=f1.fenmu*f2.fenmu;
f.yuefen();
return f;
}
fenshu operator /(fenshu &f1,fenshu &f2)
{
fenshu f;
f.flag=f1.flag*f2.flag;
f.fenzi=f1.fenzi*f2.fenmu;
f.fenmu=f1.fenmu*f2.fenzi;
f.yuefen();
return f;
}

int main()
{

fenshu f1,f2;
while(cin>>f1>>f2)
{
cout<<f1<<" + "<<f2<<" = "<<(f1+f2)<<endl;
cout<<f1<<" - "<<f2<<" = "<<(f1-f2)<<endl;
cout<<f1<<" * "<<f2<<" = "<<(f1*f2)<<endl;
cout<<f1<<" / "<<f2<<" = "<<(f1/f2)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: