本题要求编写程序,计算 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
思路:
- 用一个结构体存一下,原分子fz、原分母fm、头部head,现分子z,现分母m,正负标记flag
- 控制输出
#include <bits/stdc++.h>
#define fin freopen("in.txt", "r", stdin)
using namespace std;
typedef long long ll;
const int maxn = 200;
struct node {
ll fz, fm;
ll z, m, head, flag, g;
ll gcd(ll x, ll y) {
return y == 0 ? x : gcd(y, x % y);
}
void get() {
if(fz == 0) z = 0, head = 0, flag = 0;
else if(fz < 0) flag = -1, fz = -fz, head = fz / fm, z = fz % fm, m = fm, g = gcd(z, m), z /= g, m /= g, fz = -fz;
else { head = fz / fm; z = fz % fm; m = fm; g = gcd(z, m); z /= g; m /= g; flag = 1; }
}
}a, b;
ll gcd(ll x, ll y) { return y == 0 ? x : gcd(y, x % y); }
ll lcm(ll x, ll y) {
return x / gcd(x, y) * y;
}
void output(node x) {
if(x.flag == 0) {
cout << 0;
return;
}
if(x.flag < 0) cout << "(-";
if(x.head) cout << x.head;
if(x.z && x.head) cout << " ";
if(x.z) cout << x.z << "/" << x.m;
if(x.flag < 0) cout << ")";
}
void add(node x, node y) {
node c;
ll fm = lcm(x.fm, y.fm);
ll fz = fm / x.fm * x.fz + fm / y.fm * y.fz;
c.fm = fm, c.fz = fz;
c.get();
output(c);
}
void sub(node x, node y) {
node c;
ll fm = lcm(x.fm, y.fm);
ll fz = fm / x.fm * x.fz - fm / y.fm * y.fz;
c.fm = fm, c.fz = fz;
c.get();
output(c);
}
void mul(node x, node y) {
node c;
ll fm = x.fm * y.fm;
ll fz = x.fz * y.fz;
c.fm = fm, c.fz = fz;
c.get();
output(c);
}
void chu(node x, node y) {
node c;
if(y.flag == 0) {
cout << "Inf";
return;
}
c.fm = x.fm * y.fz;
c.fz = x.fz * y.fm;
//if(c.fm * c.fz > 0) c.fm = abs(c.fm), c.fz = abs(c.fz);
//else if(c.fm < 0) c.fm = -c.fm, c.fz = c.fz ? -c.fz : 0;
//之前用上面两行代替下面一行(改变分子、分母符号)的时候,一直过不了第三个点,想了想感觉应该是爆long long了
if(c.fm < 0) c.fm = abs(c.fm), c.fz = -c.fz;
c.get();
output(c);
}
int main() {
scanf("%lld/%lld %lld/%lld", &a.fz, &a.fm, &b.fz, &b.fm);
a.get(), b.get();
output(a);
cout << " + ";
output(b);
cout << " = ";
add(a, b);
puts("");
output(a);
cout << " - ";
output(b);
cout << " = ";
sub(a, b);
puts("");
output(a);
cout << " * ";
output(b);
cout << " = ";
mul(a, b);
puts("");
output(a);
cout << " / ";
output(b);
cout << " = ";
chu(a, b);
puts("");
return 0;
}