分數比大小(結構體版)

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 你的程式,然後:

  1. 讀入 \(Q\)。
  2. 對每筆詢問 a b c d,宣告 Fraction x(a, b), y(c, d);,並檢查兩者都是最簡分數且分母為正。不是的話,印出一行 [檢查] Fraction(a, b) 建構後必須是最簡分數且分母為正 之後直接結束(結果會是 Wrong Answer;用「測試範例」跑就看得到這行訊息)。
  3. 宣告 Fraction z;(檢查它是 \(\frac{0}{1}\)),再整包指派 z = x;。
  4. 只用 < 判斷大小: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\),所以左邊比較大。

題目頁說明

快速鍵

主要功能

  • 範例測試 — 執行題目附帶的範例測資並自動比對預期輸出。
  • 自訂測試 — 自己貼 stdin 執行程式。可勾選「與預期輸出比對 (diff)」做行對行比對。
  • 模板 — 貼上你在個人資料設定的預設程式碼模板。
  • 協作 — 與其他同學共筆編輯這題的程式碼。
  • 自動草稿 — 編輯器內容每 1.5 秒自動存到瀏覽器(per 帳號 / 題目 / 語言)。
  • 提交 — 把程式碼交給 judge 評測,回傳 AC / WA / TLE 等結果。

限制

  • 程式碼最多 65,536 字元
  • 自訂測試 stdin 與預期輸出各最多 1 MB (約 100 萬字元)
  • 自訂測試與範例測試共用一個沙箱,每人約 3 秒 1 次 (範例測試 1 秒 1 次)
  • 自訂測試與範例測試都有 15 秒 牆鐘上限(正式評測仍依題目原本時限)
  • 互動題不提供自訂測試(無法模擬與 judge 互動)。
  • 提交評測本身沒有 rate limit,但同題短時間內多次提交會被視為刷分。