原文代碼片段極度混亂,提煉出初學者高頻錯誤模式:
gets() 讀取整行,再手動解析 a/b+c/d 格式,極易越界、指針錯誤。scanf("%d/%d%c%d/%d", &a, &b, &op, &c, &d) 直接按格式讀取,或用 fgets + sscanf 安全解析。std::gcd(<numeric>),C 可用成熟的輾轉相除法實現。new/malloc)卻無 delete/free,內存洩漏嚴重。a[i] = a[i]*a[j] - a[k]*a[l] 索引混亂)。a/b、integer、integer a/b),代碼直接 printf("%d/%d") 不分情況。typedef struct { long long num; // 分子 long long den; // 分母 (始終 > 0) } Fraction; long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : (a > 0 ? a : -a); } Fraction normalize(Fraction f) { if (f.den < 0) { f.num = -f.num; f.den = -f.den; } long long g = gcd(f.num, f.den); f.num /= g; f.den /= g; return f; } Fraction add(Fraction a, Fraction b) { Fraction r = { a.num * b.den + b.num * a.den, a.den * b.den }; return normalize(r); } // sub, mul, div 同理