时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
本题要求编写程序,计算2个有理数的和、差、积、商。
输入描述:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分
母不为0。
输出描述:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的
最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中
没有超过整型范围的整数。
输入例子:
5/3 0/6
输出例子:
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>
#include <fstream>
#include <string>
#include <cstdio>
#include <cmath>
using namespace std;
class Fra
{
public :
int u, d;
Fra(){}
Fra(int a, int b)
{
u = a;
d = b;
}
void gcd()
{
int ul = u, dl = d;
int res;
if (dl == 0)
{
res = 0;
dl = 1;
}else
res = ul % dl;
while(res != 0)
{
ul = dl;
dl = res;
res = ul % dl;
}
u = u/dl; d = d/dl;
if (u < 0 && d < 0)
{
u = -u; d =-d;
}else if ((u < 0 && d > 0) || (u > 0 && d < 0))
{
u = -abs(u);
d = abs(d);
}
}
void print(ostream& cout)
{
if (d == 0)
{
cout << "Inf";
return;
}
gcd();
if (u == 0)
{
cout << 0;
return;
}
if (u / d < 0 || u <0)
cout << "(-";
if(u/d != 0)
{
cout << abs(u/d);
}
if (u%d != 0)
{
if(u/d != 0)
cout << ' ';
cout << abs(u%d) << '/' << abs(d);
}
if (u / d < 0|| u <0)
cout << ")";
}
friend Fra operator+(Fra& a, Fra& b)
{
return Fra(a.u*b.d + a.d*b.u, a.d * b.d);
}
friend Fra operator-(Fra& a, Fra& b)
{
return Fra( a.u*b.d - a.d*b.u, a.d * b.d);
}
friend Fra operator*(Fra& a, Fra& b)
{
return Fra(a.u * b.u, a.d*b.d);
}
friend Fra operator/(Fra& a, Fra& b)
{
return Fra(a.u * b.d, a.d*b.u);
}
};
int main() {
Fra a, b;
scanf("%d/%d %d/%d", &(a.u), &(a.d), &(b.u), &(b.d));
a.print(cout); cout << " + "; b.print(cout); cout << " = "; (a+b).print(cout); cout << endl;
a.print(cout); cout << " - "; b.print(cout); cout << " = "; (a-b).print(cout); cout << endl;
a.print(cout); cout << " * "; b.print(cout); cout << " = "; (a*b).print(cout); cout << endl;
a.print(cout); cout << " / "; b.print(cout); cout << " = "; (a/b).print(cout); cout << endl;
return 0;
}