题目链接
题目分析
分数的四则运算
解题思路
/**********************************
*@ID: 3stone
*@ACM: PAT.A1088 Rational Arithmetic
& PAT.B1034 有理数四则运算
*@Time: 18/8/27
*@IDE: DEV C++ 5.10
***********************************/
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct Fraction {
long long up, down;
};
//最大公约数
long long gcd(long long a, long long b) {
if(a < b) swap(a, b);
if(b == 0) return a;
else return gcd(b, a % b);
}
//化简分数
Fraction reduction(Fraction f) {
if(f.down < 0) {
f.up = -f.up;
f.down = -f.down;
}
if(f.up == 0) f.down = 1;
else {
int d = gcd(abs(f.up), abs(f.down));
f.up /= d;
f.down /= d;
}
return f;
}
//分数加法
Fraction add(Fraction a, Fraction b) {
a.up = a.up * b.down + b.up * a.down;
a.down = a.down * b.down;
return reduction(a);
}
//分数减法
Fraction minu(Fraction a, Fraction b) {
a.up = a.up * b.down - b.up * a.down;
a.down = a.down * b.down;
return reduction(a);
}
//分数乘法
Fraction multi(Fraction a, Fraction b) {
a.up *= b.up;
a.down *= b.down;
return reduction(a);
}
//分数除法
Fraction divide(Fraction a, Fraction b) {
//判断除数是否为零,根据题目返回信息
a.up *= b.down;
a.down *= b.up;
return reduction(a);
}
//输出分数结果
void showResult(Fraction a) {
a = reduction(a);
if(a.up < 0) printf("(");
if(a.down == 1) printf("%lld", a.up);
else if(abs(a.up) > a.down) {
printf("%lld %lld/%lld", a.up / a.down, abs(a.up) % a.down, a.down); //负号只在整数部分前输出
} else {
printf("%lld/%lld", a.up, a.down);
}
if(a.up < 0) printf(")");
}
int main() {
Fraction f_a, f_b, result;
while(scanf("%lld/%lld %lld/%lld", &f_a.up, &f_a.down, &f_b.up, &f_b.down) != EOF){
//加法
showResult(f_a); printf(" + "); showResult(f_b); printf(" = ");
showResult(add(f_a, f_b)); printf("\n");
//减法
showResult(f_a); printf(" - "); showResult(f_b); printf(" = ");
showResult(minu(f_a, f_b)); printf("\n");
//乘法
showResult(f_a); printf(" * "); showResult(f_b); printf(" = ");
showResult(multi(f_a, f_b)); printf("\n");
//除法
showResult(f_a); printf(" / "); showResult(f_b); printf(" = ");
if(f_b.up == 0) printf("Inf");
else showResult(divide(f_a, f_b));
printf("\n");
}
//system("pause");
return 0;
}