我的代码:
#include<iostream>
using namespace std;
long long gcd(long long a, long long b) { //使用辗转相除法求最大公约数,其他的方法多会超时
long long c = a % b;
while(c!=0){
a = b;
b = c;
c = a % b;
}
return b;
}
long long lcm(long long a1, long long a2) {
long long c = a1 * a2 / gcd(a1, a2);
return c;
}
void out(long long a, long long b, long long k, long long flag) {
if (flag < 0) {
cout << "(-" ;
}
if (k != 0) {
cout << k;
if (a != 0) {
cout <<" "<< a << "/" << b;
}
}
else {
if (a == 0)
cout << a;
else
cout << a << "/" << b;
}
if (flag < 0) {
cout << ")" ;
}
}
int main() {
long long a1, b1, a2, b2; //两个整型相乘可能会超出整型的范围
cin >> a1;
getchar(); //获取两个数之间的字符‘/’
cin >> b1;
cin >> a2;
getchar();
cin >> b2;
long long c1=0,sum1=0,sum2=0,flag1=1,flag2=1; //使用flag保证分数都是正数,方便后续计算
if (a1 < 0) {
a1 = -a1;
flag1 = -1;
}
if (a2 < 0) {
a2 = -a2;
flag2 = -1;
}
if (a1 != 0) {
c1=gcd(a1, b1);
a1 = a1 / c1;
b1 = b1 / c1;
}
if (a2 != 0) {
c1 = gcd(a2, b2);
a2 = a2 / c1;
b2 = b2 / c1;
}
if (a1 == 0) {
flag1 = 0;
}
if (a2 == 0) {
flag2 = 0;
}
sum1 = a1 / b1;
sum2 = a2 / b2;
a1 = a1 - b1 * sum1;
a2 = a2 - b2 * sum2;
long long a3,b3,c2,sum3,flag3=1,c3;
c2 = lcm(b1, b2);
for (int i = 0; i < 4; i++) { //要注意加减运算和乘除运算的差异
flag3 = 1;
out(a1, b1, sum1, flag1);
if (i == 0) {
cout << " + ";
out(a2, b2, sum2, flag2);
cout << " = ";
a3 = flag1 * (sum1*c2+a1 * (c2 / b1)) + flag2 * (sum2*c2+a2 * (c2 / b2));
b3 = c2;
if (a3 < 0) {
a3 = -a3;
flag3 = -1;
}
if (a3 != 0) {
c3 = gcd(a3, b3);
a3 = a3 / c3;
b3 = b3 / c3;
}
sum3 = a3 / b3;
a3 = a3 - sum3 * b3;
out(a3, b3, sum3, flag3);
cout << endl;
}
else if (i == 1) {
cout << " - ";
out(a2, b2, sum2, flag2);
cout << " = ";
a3= flag1 * (sum1 * c2 + a1 * (c2 / b1)) - flag2 * (sum2 * c2 + a2 * (c2 / b2));
b3 = c2;
if (a3 < 0) {
a3 = -a3;
flag3 = -1;
}
if (a3 != 0) {
c3 = gcd(a3, b3);
a3 = a3 / c3;
b3 = b3 / c3;
}
sum3 = a3 / b3;
a3 = a3 - sum3 * b3;
out(a3, b3, sum3, flag3);
cout << endl;
}
else if (i == 2) {
cout << " * ";
out(a2, b2, sum2, flag2);
cout << " = ";
a3 = flag1 * (sum1*b1+a1)*flag2*(sum2*b2+a2);
b3 = b1 * b2;
if (a3 < 0) {
a3 = -a3;
flag3 = -1;
}
if (a3 != 0) {
c3 = gcd(a3, b3);
a3 = a3 / c3;
b3 = b3 / c3;
}
sum3 = a3 / b3;
a3 = a3 - sum3 * b3;
out(a3, b3, sum3, flag3);
cout << endl;
}
else if (i == 3) {
cout << " / ";
out(a2, b2, sum2, flag2);
cout << " = ";
if ((a2+sum2*b2)==0) {
cout << "Inf";
}
else {
a3 = flag1 * (a1+sum1*b1) * flag2 * b2; //除法是被除数乘以除数的倒数
b3 = b1 * (sum2*b2+a2);
if (a3 < 0) {
a3 = -a3;
flag3 = -1;
}
if (a3 != 0) {
c3 = gcd(a3, b3);
a3 = a3 / c3;
b3 = b3 / c3;
}
sum3 = a3 / b3;
a3 = a3 - sum3 * b3;
out(a3, b3, sum3, flag3);
cout << endl;
}
}
}
system("pause");
return 0;
}