1034 有理数四则运算 (20 point(s))
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// 最大公约数
int gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
void print(ll a, ll b){
// 防止除法后分母为负
if(b < 0) a = -a, b = -b;
// 为0情况
if(a == 0){ cout << 0; return;}
if(b == 0){ cout << "Inf"; return;}
// 化为最简形式
int tmp = abs(gcd(a, b));
a /= tmp, b /= tmp;
// 负数的括号
if(a < 0) cout << '(';
if(a % b == 0) cout << a / b;
else if(abs(a) > abs(b)) cout << a / b << " " << abs(a % b) << '/' << b;
else if(abs(a) < abs(b)) cout << a << '/' << b;
if(a < 0) cout << ')';
}
int main() {
ll a1, b1, a2, b2;
scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
print(a1, b1); cout << " + "; print(a2, b2); cout << " = "; print(a1 * b2 + a2 * b1, b1 * b2); cout << endl;
print(a1, b1); cout << " - "; print(a2, b2); cout << " = "; print(a1 * b2 - a2 * b1, b1 * b2); cout << endl;
print(a1, b1); cout << " * "; print(a2, b2); cout << " = "; print(a1 * a2, b1 * b2); cout << endl;
print(a1, b1); cout << " / "; print(a2, b2); cout << " = "; print(a1 * b2, b1 * a2); cout << endl;
}
因为 int * int 可能超过 int 的范围 所以需要用 long long。而用 long long 又用 scanf 读取的话,就得用 %lld 否则会读取错误。
参考代码
参考理解
浙公网安备 33010602011771号