分數比大小(結構體版)
0.5s 256M這題是〔分數比大小〕的結構體版:把分數包成一個結構體 Fraction,「化成最簡分數」交給建構子、「比大小」交給多載的 <——評測程式只負責讀入、建構、比較、印出。
寫好的 Fraction 也能直接拿去通過原題:把它貼進下面這支主程式的空位,就是分數比大小的完整解答。
#include <iostream>
#include <numeric>
using namespace std;
// ===== 把你的 struct Fraction 貼在這裡 =====
// ==========================================
int main() {
long long a, b, c, d;
cin >> a >> b >> c >> d;
Fraction x(a, b), y(c, d);
if (x < y) cout << "<\n";
else if (y < x) cout << ">\n";
else cout << "=\n";
return 0;
}
請定義結構體 Fraction,用兩個 long long 成員 p(分子)、q(分母)表示分數 \(\frac{p}{q}\),並且隨時保持最簡分數、分母為正(例如 \(\frac{4}{-8}\) 存起來必須是 p = -1、q = 2;\(0\) 一律存成 p = 0、q = 1)。成員的名稱、型態與簽名都必須完全一樣:
| 成員 | 型態/簽名 | 意義 |
|---|---|---|
p |
long long |
分子 |
q |
long long |
分母(永遠是正的) |
Fraction() |
建構子 | 無參數:分數為 \(0\),也就是 p = 0、q = 1 |
Fraction(long long a, long long b) |
建構子 | 表示 \(\frac{a}{b}\)(\(b \ne 0\),可能是負的):建構完必須已經約分、分母為正 |
bool operator < (const Fraction &b) const |
成員函式 | 自己是否小於 b |
兩個建構子也可以照 14.5 補充知識的寫法,用預設參數 Fraction(long long a = 0, long long b = 1) 合併成一個。
你只需要寫這個結構體的定義,不用寫 main、不用 #include 任何東西——評測程式會自動在你的程式最上方加上這題需要的標頭(<numeric>)與 using namespace std;,要用其他標頭自己再 #include 即可(所以 gcd 能直接用)。想把含有 main 的完整程式貼上來測試也可以,評測時會忽略你的 main。
可以直接複製下面的骨架來改:
struct Fraction {
long long p; // 分子
long long q; // 分母(保持為正)
Fraction(long long a = 0, long long b = 1) {
// 把 a/b 存進來,化成最簡分數、分母為正
}
bool operator < (const Fraction &b) const {
// 分母都是正的:交叉相乘
}
};
評測程式會做的事
評測程式會 #include 你的程式,然後:
- 讀入 \(Q\)。
- 對每筆詢問
a b c d,宣告Fraction x(a, b), y(c, d);,並檢查兩者都是最簡分數且分母為正。不是的話,印出一行[檢查] Fraction(a, b) 建構後必須是最簡分數且分母為正之後直接結束(結果會是 Wrong Answer;用「測試範例」跑就看得到這行訊息)。 - 宣告
Fraction z;(檢查它是 \(\frac{0}{1}\)),再整包指派z = x;。 - 只用
<判斷大小:z < y成立就印<;否則y < z成立就印>;兩個都不成立就印=。
若不符合規格,編譯訊息的第一行會告訴你缺了什麼,例如 [檢查] Fraction 還沒有多載 operator <(記得兩個 const)。
輸入格式
(這是評測程式讀的輸入。)第一行有一個整數 \(Q\),代表詢問數量。接下來 \(Q\) 行,每行四個整數 \(a, b, c, d\),代表要比較 \(\frac{a}{b}\) 和 \(\frac{c}{d}\)。
限制
- \(1 \le Q \le 10^4\)
- \(-10^9 \le a, c \le 10^9\)
- \(-10^9 \le b, d \le 10^9\),且 \(b \ne 0\)、\(d \ne 0\)(分母可能是負的)
輸出格式
對每筆詢問輸出一行:\(\frac{a}{b}\) 小於 \(\frac{c}{d}\) 印 <,相等印 =,大於印 >。
範例輸入 1
6
1 2 3 4
-1 -2 -3 -4
-1 2 4 -8
0 5 0 -7
3 -4 1 2
999999999 1000000000 999999998 999999999
範例輸出 1
<
<
=
=
<
>
範例解釋 1
- 第 \(2\) 筆:\(\frac{-1}{-2}\) 就是 \(\frac{1}{2}\)、\(\frac{-3}{-4}\) 就是 \(\frac{3}{4}\)——建構子要先把分母翻正,交叉相乘的方向才會對。
- 第 \(3\) 筆:\(\frac{-1}{2}\) 和 \(\frac{4}{-8}\) 建構後都是
p = -1、q = 2,相等。 - 第 \(4\) 筆:\(\frac{0}{5}\) 和 \(\frac{0}{-7}\) 都是 \(0\),建構後都必須是
p = 0、q = 1。 - 第 \(6\) 筆:兩個分數只差大約 \(10^{-18}\),用浮點數除完再比會被當成相等;交叉相乘 \(999999999 \times 999999999 = 999999998000000001\) 比 \(999999998 \times 1000000000 = 999999998000000000\) 大 \(1\),所以左邊比較大。