Test Message

b538: 分數運算-2

內容

上次老師的教甄題後,就想說出個分數的加、減、乘、除,也許有人出過類似題,但還是想出這題為下一題準備


輸入

每組測資有多列以 EOF 結束,每列四個整數 -9999 <=a,b,c,d <=9999 一個字元{ + - * / }以空白隔開
代表兩個分數 a/b @ c/d ,其中@為加減乘除之一。{b,d 不為 0,若為除法運算則 c 亦不為 0}

-1 2 4 -3 +
1 1 1 1 -
1 1 1 2 +
2 3 1 2 *
2 3 2 3 /

輸出

對輸入的每一列,輸出 1 個 分數的運算結果且為最簡分數 p/q ,若 p 被 q 整除,則只顯示一個整除後的整數。

-11/6
0
3/2
1/3
1


解題思路

輸入很小,直接乘法擴分,算完之後再約分回來,注意負號處理即可。


完整程式碼

AC (2ms, 96KB)
#include <stdio.h>
#define SWAP(x, y) x^=(y^=(x^=y))

int gcd(int m, int n)
{
while (n)
{
m %= n;
SWAP(m, n);
}
return m;
}

int main()
{
int a, b, c, d, e, f, g;
char op;
while (scanf(" %d %d %d %d %c", &a, &b, &c, &d, &op) == 5)
{
switch (op)
{
case '+':
e = a * d + c * b;
f = b * d;
break;
case '-':
e = a * d - c * b;
f = b * d;
break;
case '*':
e = a * c;
f = b * d;
break;
case '/':
e = a * d;
f = b * c;
break;
default:
break;
}
g = gcd(e, f);
e /= g, f /= g;
if (f < 0)
{
e = -e;
f = -f;
}
if (f == 1)
printf("%d\n", e);
else
printf("%d/%d\n", e, f);
}
return 0;
}