輸入兩個分數 a/b c/d,輸出其和、差、積、商,結果需化簡、帶分數格式、負數加括號、除零顯示 Inf。
typedef long long LL;
struct Fraction {
LL up, down; // 分子、分母
};
// 最大公約數
LL gcd(LL a, LL b) { return b ? gcd(b, a%b) : a; }
// 化簡:統一分母為正、提取整數部分、約分
Fraction reduce(Fraction f) {
if (f.down < 0) f.down = -f.down, f.up = -f.up;
if (f.up == 0) { f.down = 1; return f; }
LL d = gcd(llabs(f.up), f.down);
f.up /= d; f.down /= d;
return f;
}
// 四則運算(均調用 reduce)
Fraction add(Fraction a, Fraction b) {
Fraction r = {a.up*b.down + a.down*b.up, a.down*b.down};
return reduce(r);
}
Fraction sub(Fraction a, Fraction b) { ... }
Fraction mul(Fraction a, Fraction b) { ... }
Fraction div(Fraction a, Fraction b) {
Fraction r = {a.up*b.down, a.down*b.up};
return reduce(r);
}
| 情況 | 輸出格式 | 示例 |
|---|---|---|
| 分母為 1 | 整數 | 5 |
| 分子為 0 | 0 | 0 |
| |分子| > 分母 | 帶分數 | 2 1/3 (即 7/3) |
| 真分數 | 分數 | 2/3 |
| 負數 | 括號包裹 | (-2 1/3) |
| 除數為 0 | Inf | Inf |
void show(Fraction f) {
f = reduce(f);
if (f.up < 0) printf("(");
if (f.down == 1) printf("%lld", f.up);
else if (f.up == 0) printf("0");
else if (llabs(f.up) > f.down)
printf("%lld %lld/%lld", f.up/f.down, llabs(f.up)%f.down, f.down);
else
printf("%lld/%lld", f.up, f.down);
if (f.up < 0) printf(")");
}
int main() {
Fraction a, b;
while (scanf("%lld/%lld %lld/%lld", &a.up,&a.down,&b.up,&b.down) == 4) {
a = reduce(a); b = reduce(b);
show(a); printf(" + "); show(b); printf(" = "); show(add(a,b)); printf("\n");
show(a); printf(" - "); show(b); printf(" = "); show(sub(a,b)); printf("\n");
show(a); printf(" * "); show(b); printf(" = "); show(mul(a,b)); printf("\n");
show(a); printf(" / "); show(b); printf(" = ");
if (b.up == 0) printf("Inf\n");
else { show(div(a,b)); printf("\n"); }
}
return 0;
}
輸入: 2/3 -4/5 輸出: 2/3 + (-4/5) = (-2/15) 2/3 - (-4/5) = 1 7/15 2/3 * (-4/5) = (-8/15) 2/3 / (-4/5) = (-5/6)
long long 防止中間結果溢出llabs 配合 long long 取絕對值