1034 有理數四則運算 (20 分)
本題要求編寫程序,計算 2 個有理數的和、差、積、商。
輸入格式:
輸入在一行中按照 a1/b1 a2/b2 的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不爲 0。
輸出格式:
分別在 4 行中按照 有理數1 運算符 有理數2 = 結果 的格式順序輸出 2 個有理數的和、差、積、商。注意輸出的每個有理數必須是該有理數的最簡形式 k a/b,其中 k 是整數部分,a/b 是最簡分數部分;若爲負數,則須加括號;若除法分母爲 0,則輸出 Inf。題目保證正確的輸出中沒有超過整型範圍的整數。
輸入樣例 1:
2/3 -4/2
輸出樣例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
輸入樣例 2:
5/3 0/6
輸出樣例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
using namespace std;
#include<algorithm>
#include<iostream>
#include<cstdio>
typedef struct Fraction//分數結構體
{
long long int up, down;//分子分母
}Fraction;
Fraction A, B;
long long int gcd(long long int a, long long int b)//求最大公約數
{
if(!b) return a;
return gcd(b, a%b);
}
Fraction reduction(Fraction X)//化簡
{
if(X.down < 0) X.up = -X.up, X.down = -X.down;
if(!X.up) X.down = 1;
else
{
long long int d = gcd(abs(X.up), abs(X.down));
X.up /= d, X.down /= d;
}
return X;
}
void print_X(Fraction X)//打印某有理數
{
X = reduction(X);
if(!X.up) printf("0");
else if(X.down == 1)
{
if(X.up < 0) printf("(%lld)", X.up);
else printf("%lld", X.up);
}
else if(abs(X.up) > X.down)//假分數
{
if(X.up < 0)
{
printf("(%lld %lld/%lld)", X.up/X.down, abs(X.up%X.down), X.down);
}
else
{
printf("%lld %lld/%lld", X.up/X.down, X.up%X.down, X.down);
}
}
else
{
if(X.up < 0) printf("(%lld/%lld)", X.up, X.down);
else printf("%lld/%lld", X.up, X.down);
}
}
void print(Fraction A, char ch, Fraction B)//打印有理數1 運算符 有理數2 =
{
print_X(A);
printf(" %c ", ch);
print_X(B);
printf(" = ");
}
void print_result(Fraction R)//打印運算結果和回車
{
print_X(R);
printf("\n");
}
Fraction ADD(Fraction A, Fraction B)//加減乘除
{
Fraction result;
result.down = A.down*B.down;
result.up = A.up*B.down + A.down*B.up;
return result;
}
Fraction MINUS(Fraction A, Fraction B)
{
Fraction result;
result.down = A.down*B.down;
result.up = A.up*B.down - A.down*B.up;
return result;
}
Fraction MULTIPLY(Fraction A, Fraction B)
{
Fraction result;
result.down = A.down*B.down;
result.up = A.up*B.up;
return result;
}
Fraction DIVIDE(Fraction A, Fraction B)
{
Fraction result;
result.down = A.down*B.up;
result.up = A.up*B.down;
return result;
}
int main()
{
scanf("%lld/%lld %lld/%lld", &A.up, &A.down, &B.up, &B.down);
print(A, '+', B);
print_result(ADD(A, B));
print(A, '-', B);
print_result(MINUS(A, B));
print(A, '*', B);
print_result(MULTIPLY(A, B));
print(A, '/', B);
if(!reduction(B).up) printf("Inf\n");//除數爲0單獨考慮
else print_result(DIVIDE(A, B));
return 0;
}