说明几个要点:
1、题目给的是两个分数,看成是两个分子、两个分母即可。
2、负号不需要特殊处理,因为负号总是给到分子。
3、输入数据以后,分别得到 加运算的分子和分母、减运算的分子和分母、乘法的分子和分母、除法的分子和分母,这个过程只需将简单的算术转化为代码即可。
4、2的过程中需要得到最小公倍数和最大公约数。
5、所有需要的数据得到后,反复调用输出函数simply();
代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
long long gcd(long long a, long long b)
{
b = abs(b);
a = abs(a);
return b == 0 ? a : gcd(b, a%b);
}
void simply(long long a, long long b)
{
int tag = 0;
if (a == 0)
{
cout << 0;
return;
}
if (a < 0 && b < 0)
{
a = abs(a);
b = abs(b);
}
if (a < 0 || b < 0)
{
tag = 1;
a = abs(a);
b = abs(b);
}
if (tag)
cout << "(-";
long long gys = gcd(a, b);
a /= gys;
b /= gys;
if (a%b == 0)
cout << a / b;
else
{
if (a > b)
cout << a / b << ' ' << a % b << '/' << b;
if (a < b)
cout << a << '/' << b;
}
if (tag)
cout << ')';
}
int main()
{
char c;
long long fz1, fm1, fz2, fm2;
cin >> fz1 >> c >> fm1 >> fz2 >> c >> fm2;
long long gbs = fm1 * fm2 / gcd(fm1, fm2);
long long sumfz = gbs / fm1 * fz1 + gbs / fm2 * fz2;
long long sumfm = gbs;
long long gys = gcd(sumfz, sumfm);
sumfz /= gys;
sumfm /= gys;
long long chafz = gbs / fm1 * fz1 - gbs / fm2 * fz2;
long long chafm = gbs;
gys = gcd(chafz, chafm);
chafz /= gys;
chafm /= gys;
long long profz = fz1 * fz2;
long long profm = fm1 * fm2;
gys = gcd(profz, profm);
profz /= gys;
profm /= gys;
long long divfz = fz1 * fm2;
long long divfm = fm1 * fz2;
gys = gcd(divfz, divfm);
divfz /= gys;
divfm /= gys;
simply(fz1, fm1);
cout << " + ";
simply(fz2, fm2);
cout << " = ";
simply(sumfz, sumfm);
cout << endl;
simply(fz1, fm1);
cout << " - ";
simply(fz2, fm2);
cout << " = ";
simply(chafz, chafm);
cout << endl;
simply(fz1, fm1);
cout << " * ";
simply(fz2, fm2);
cout << " = ";
simply(profz, profm);
cout << endl;
simply(fz1, fm1);
cout << " / ";
simply(fz2, fm2);
cout << " = ";
if (fz2 == 0)
cout << "Inf";
else
simply(divfz, divfm);
return 0;
}