题目:
输入样例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
分析:
这道题最好把分子分母四个数分别接收下来,先直接通分计算,然后统一化简,否则会很麻烦。
另外化简前先检查分子分母是否为0,分子为零则分式为0,分母为0则分式趋于无穷大(Inf)
通分计算没什么好说的,对于化简:
1.先约分,这里会用到辗转相除求最大公约数的方法
2.分别取整数和分数的部分
注意:别忘了正负号的处理,可以先把符号分离出来
代码如下(借鉴了网上的代码):
#include <iostream>
using namespace std;
long gcd(long t1, long t2) {return t2 == 0 ? t1 : gcd(t2, t1 % t2);}
void simplify(long m, long n) {
if (m * n == 0) {
printf("%s", n == 0 ? "Inf" : "0");
return ;
}
bool flag = (m > 0 && n < 0) || (m < 0 && n > 0);
m = abs(m); n = abs(n);
long p = gcd(m, n);
m /= p; n /= p;
if (flag) printf("(-");
if (m >= n) {
printf("%ld",m / n);
if (m % n != 0) printf(" %ld/%ld", m % n, n);
}
else printf("%ld/%ld", m % n, n);
if (flag) printf(")");
}
int main() {
long a, b, c, d;
scanf("%ld/%ld %ld/%ld", &a, &b, &c, &d);
simplify(a,b); printf(" + "); simplify(c,d); printf(" = "); simplify(a*d+b*c,b*d); printf("\n");
simplify(a,b); printf(" - "); simplify(c,d); printf(" = "); simplify(a*d-b*c,b*d); printf("\n");
simplify(a,b); printf(" * "); simplify(c,d); printf(" = "); simplify(a*c,b*d); printf("\n");
simplify(a,b); printf(" / "); simplify(c,d); printf(" = "); simplify(a*d,b*c);
return 0;
}