原文链接: PAT B1034. 有理数四则运算(20)
上一篇: PAT B1013. 数素数 (20)
下一篇: PAT A1015. Reversible Primes (20)
1034. 有理数四则运算(20)
https://www.patest.cn/contests/pat-b-practise/1034
时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
本题要求编写程序,计算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
//PAT B1034 A1088
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
LL gcd(LL x, LL y) {
x = x > 0 ? x : -x;
y = y > 0 ? y : -y;
LL t;
while (y != 0) {
t = x%y;
x = y;
y = t;
}
return x;
}
struct Fraction {
LL up, down;
Fraction(LL up, LL down) :up(up), down(down) {
reduction();
}
Fraction() { up = 0; down = 1; }
//化简
void reduction() {
LL g = gcd(up, down);
up /= g;
down /= g;
}
void show() {
if (up < 0) printf("(");
if (down == 1)
printf("%lld", up);
else if (abs(up) > down)
printf("%lld %lld/%lld", up / down, abs(up) % down, down);
else
printf("%lld/%lld", up, down);
if (up < 0) printf(")");
}
friend Fraction operator + (const Fraction& a, const Fraction& b) {
LL up = a.up*b.down + a.down*b.up;
LL down = a.down*b.down;
return Fraction(up, down);
}
friend Fraction operator - (const Fraction& a, const Fraction& b) {
LL up = a.up*b.down - a.down*b.up;
LL down = a.down*b.down;
return Fraction(up, down);
}
friend Fraction operator * (const Fraction& a, const Fraction& b) {
return Fraction(a.up*b.up, a.down*b.down);
}
friend Fraction operator / (const Fraction&a, const Fraction& b) {
LL up = a.up*b.down;
LL down = a.down*b.up;
if (down < 0) {
down *= -1;
up *= -1;
}
return Fraction(up, down);
}
};
int main(int argc, char *argv[]) {
LL up1, down1, up2, down2;
scanf("%lld/%lld %lld/%lld", &up1, &down1, &up2, &down2);
Fraction a(up1, down1), b(up2, down2);
a.show();
printf(" + ");
b.show();
printf(" = ");
(a + b).show();
printf("\n");
a.show();
printf(" - ");
b.show();
printf(" = ");
(a - b).show();
printf("\n");
a.show();
printf(" * ");
b.show();
printf(" = ");
(a*b).show();
printf("\n");
a.show();
printf(" / ");
b.show();
printf(" = ");
if (b.up == 0) printf("Inf");
else (a / b).show();
printf("\n");
return 0;
}