首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

PAT 1088 有理數四則運算:分數化簡與格式化輸出完整實現

     編輯:關於C語言

PAT 1088 Rational Arithmetic:分數加減乘除通用解法

輸入兩個分數 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
分子為 000
|分子| > 分母帶分數2 1/3 (即 7/3)
真分數分數2/3
負數括號包裹(-2 1/3)
除數為 0InfInf

輸出函數實現

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 取絕對值
  • 除法檢查被除數分子是否為 0(即除數分數值為 0)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved