题目大意:
在一行中按照a1/b1 a2/b2给出两个分数的有理数,其中分子分母均是整型范围内的整数,负号在分子前,分母不为0,
求这两个分数的加法,减法,乘法,除法的计算式,如果是假分数,则按带分数的形式输出,如果是整数,则输出整数,否则输出真分数,
如果除数为0,输出INF。
思路:
常规的分数四则运算
注意每一步都要约分,计算最大公约数时使用绝对值。
使用long long 类型,使用int会分母相乘会溢出。
AC代码:
//PAT_A 1088
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {
if (b == 0)return a;
else return gcd(b, a % b);
}
struct Fraction {
ll up, down;
};
Fraction reduction(Fraction result) {
if (result.down < 0) {
result.up = -result.up;
result.down = -result.down;
}
if (result.up == 0)result.down = 1;
else {
int d = gcd(abs(result.up), abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
Fraction add(Fraction a, Fraction b) {
Fraction result;
result.up = a.up * b.down + a.down * b.up;
result.down = a.down * b.down;
return(reduction(result));
}
Fraction minu(Fraction a, Fraction b) {
Fraction result;
result.up = a.up * b.down - a.down * b.up;
result.down = a.down * b.down;
return(reduction(result));
}
Fraction multi(Fraction a, Fraction b) {
Fraction result;
result.up = a.up * b.up;
result.down = a.down * b.down;
return(reduction(result));
}
Fraction divide(Fraction a, Fraction b) {
Fraction result;
result.up = a.up * b.down;
result.down = a.down * b.up;
return(reduction(result));
}
void showResult(Fraction r) {
r = reduction(r);
if (r.up < 0)printf("(");
if (r.down == 1)printf("%lld", r.up);
else if (abs(r.up) > r.down)printf("%lld %lld/%lld", r.up / r.down, abs(r.up) % r.down, r.down);
else printf("%lld/%lld", r.up, r.down);
if (r.up < 0)printf(")");
}
int main() {
Fraction a, b;
(void)scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
showResult(a);
printf(" + ");
showResult(b);
printf(" = ");
showResult(add(a, b));
printf("\n");
showResult(a);
printf(" - ");
showResult(b);
printf(" = ");
showResult(minu(a, b));
printf("\n");
showResult(a);
printf(" * ");
showResult(b);
printf(" = ");
showResult(multi(a, b));
printf("\n");
showResult(a);
printf(" / ");
showResult(b);
printf(" = ");
if (b.up == 0)printf("Inf");
else showResult(divide(a, b));
return 0;
}