問題描述: 給定兩個分數 a/b、c/d,求其和並化為最簡形式 e/f。
T (T ≤ 1000)a, b, c, d (0 < a,b,c,d ≤ ...)每行輸出兩個整數 e f,表示最簡分數 e/f。
Input:
2
1 2 1 3
4 3 2 3
Output:
5 6
2 1
分數加法公式:a/b + c/d = (ad + bc) / bd
分子 m = a*d + b*c,分母 n = b*d
求 gcd(m, n),分子分母同除以 GCD 即得最簡形式。
#include
// 遞歸求最大公約數(歐幾里得算法)
int gcd(int m, int n) {
return n == 0 ? m : gcd(n, m % n);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
int a, b, c, d;
scanf("%d %d %d %d", &a, &b, &c, &d);
long long m = 1LL * a * d + 1LL * b * c; // 用 long long 防溢位
long long n = 1LL * b * d;
int g = gcd(m, n);
printf("%lld %lld\n", m / g, n / g);
}
return 0;
}
a,b,c,d 乘積可能超過 int 範圍,建議用 long long 存儲中間結果2 1O(T * log(max(m,n))),GCD 為對數級O(1)此題考察分數運算基礎與 GCD 算法應用,是 ACM 入門經典題型。