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

分數加減法 C 語言完整實作(含約分、輸入解析、格式化輸出)

     編輯:關於C語言

題目需求

讀取多行 a/b+c/d 或 a/b-c/d,輸出最簡分數結果。分子分母為整數,結果須約分、分母為正、整數輸出無分母、零輸出 0。

資料結構

typedef struct { int num; int den; } Fraction; // 分子、分母

核心演算法

  1. 輸入解析:scanf("%d / %d %c %d / %d", &a, &b, &op, &c, &d),允許空白。
  2. 減法轉加法:op=='-' ? c=-c : 0。
  3. 通分:lcm = lcm(b, d),num = a*lcm/b + c*lcm/d,den = lcm。
  4. 約分:g = gcd(|num|, |den|),num/=g; den/=g;。
  5. 格式化輸出:負號提前、分母 1 只印分子、零印 0。

完整程式碼

#include <stdio.h>
#include <stdlib.h>

typedef struct { int num, den; } Fraction;

int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }
int lcm(int a, int b) { return a / gcd(a,b) * b; }

void reduce(Fraction *f) {
    int g = gcd(abs(f->num), abs(f->den));
    f->num /= g; f->den /= g;
    if (f->den < 0) { f->num = -f->num; f->den = -f->den; }
}

void print_frac(Fraction f) {
    if (f.num == 0) { puts("0"); return; }
    if (f.num < 0) { putchar('-'); f.num = -f.num; }
    if (f.den == 1) printf("%d\n", f.num);
    else printf("%d/%d\n", f.num, f.den);
}

int read_frac(Fraction *f) {
    return scanf("%d / %d", &f->num, &f->den) == 2;
}

int read_expr(Fraction *f1, char *op, Fraction *f2) {
    if (!read_frac(f1)) return 0;
    if (scanf(" %c", op) != 1) return 0;
    if (*op != '+' && *op != '-') return 0;
    if (!read_frac(f2)) return 0;
    return 1;
}

int main() {
    Fraction f1, f2; char op;
    while (read_expr(&f1, &op, &f2)) {
        if (f1.den == 0 || f2.den == 0) { puts("分母不可為零"); continue; }
        if (op == '-') f2.num = -f2.num;
        int L = lcm(abs(f1.den), abs(f2.den));
        f1.num = f1.num * (L / f1.den) + f2.num * (L / f2.den);
        f1.den = L;
        reduce(&f1);
        print_frac(f1);
    }
    return 0;
}

測試範例

輸入:
1/8+3/8
1/4-1/2
1/3-1/3

輸出:
1/2
-1/4
0

關鍵細節

  • scanf("%d / %d") 中的空白可匹配任意空白字元,極具彈性。
  • lcm 計算先除後乘避免溢位:a/gcd*a*b。
  • 約分後統一將分母轉正,負號集中在分子。
  • 零值特判:分子為 0 直接輸出 0,避免 0/1。

常見錯誤(源自初學者代碼)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤錯誤代碼正確做法
未檢查分母為零直接通分讀入後立即判斷
減法未轉加法分開邏輯if(op=='-') c=-c; 統一加法
約分用輾轉相除但未取絕對值gcd(a,b) 直接用負數gcd(abs(a),abs(b))
輸出格式不符負號在分母、整數仍印分母統一格式化函數處理