本題要求編寫程序,計算 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
#include<cstdio> #include<algorithm> using namespace std;typedef long long ll;struct Fraction{ll up,down; }a,b; ll gcd(ll a, ll b){return b == 0?a:gcd(b,a%b); }Fraction reduction(Fraction result){if(result.down < 0){result.down = -result.down;result.up = -result.up;}if(result.up == 0) result.down = 1;int d = gcd(abs(result.up),abs(result.down));result.up /= d;result.down /= d;return result; }Fraction add(Fraction f1,Fraction f2){Fraction result;result.up = f1.up*f2.down + f1.down * f2.up;result.down = f1.down*f2.down;return result; }Fraction minu(Fraction f1,Fraction f2){Fraction result;result.up = f1.up*f2.down - f1.down * f2.up;result.down = f1.down*f2.down;return result; }Fraction multi(Fraction f1,Fraction f2){Fraction result;result.up = f1.up*f2.up;result.down = f1.down*f2.down;return result; }Fraction divide(Fraction f1,Fraction f2){Fraction result;result.up = f1.up*f2.down;result.down = f1.down*f2.up;return result; }void showResult(Fraction r){r = reduction(r);if(r.up < 0) printf("(");if(r.down == 1) printf("%lld",r.up);else{if(abs(r.up) > r.down){printf("%lld %lld/%lld",r.up/r.down,abs(r.up)%r.down,r.down);}else{printf("%lld/%lld",r.up,r.down);}}if(r.up < 0) printf(")"); }int main(){scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);showResult(a);printf(" + ");showResult(b);printf(" = ");showResult(add(a,b));printf("\n");showResult(a);printf(" - ");showResult(b);printf(" = ");showResult(minu(a,b));printf("\n");showResult(a);printf(" * ");showResult(b);printf(" = ");showResult(multi(a,b));printf("\n");showResult(a);printf(" / ");showResult(b);printf(" = ");if(b.up == 0) printf("Inf");else showResult(divide(a,b));printf("\n");return 0; }
?