给定分子分母能准确给出其标准形式,期间需要求最大公约数,注意负数还有加括号的处理
#include <iostream>
#include <cstdio>
#include <sstream>
using namespace std;
long long gcd(long long a, long long b){
while(b){
long long r = a%b;
a = b;
b = r;
}
return a;
}
string format(long long n, long long d){
if(n == 0) return "0";
string s;
stringstream ss;
bool neg = n < 0;
if(neg){
n = -n;
ss << "(-";
}
long long r = gcd(n, d);
n /= r;
d /= r;
if(n%d == 0){
ss << n;
}else if(n > d){
ss << n/d;
ss << " ";
ss << n%d << "/" << d;
}else{
ss << n << "/" << d;
}
if(neg){
ss << ")";
}
getline(ss, s);
return s;
}
int main(){
long long a1,b1,a2,b2;
scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
// +
long long sum1 = a1*b2 + a2*b1;
long long sum2 = b1*b2;
// -
long long sub1 = a1*b2 - a2*b1;
long long sub2 = b1*b2;
// *
long long mul1 = a1*a2;
long long mul2 = b1*b2;
printf("%s + %s = %s\n", format(a1, b1).c_str(), format(a2, b2).c_str(), format(sum1, sum2).c_str());
printf("%s - %s = %s\n", format(a1, b1).c_str(), format(a2, b2).c_str(), format(sub1, sub2).c_str());
printf("%s * %s = %s\n", format(a1, b1).c_str(), format(a2, b2).c_str(), format(mul1, mul2).c_str());
// /
if(a2 == 0){
printf("%s / %s = Inf\n", format(a1, b1).c_str(), format(a2, b2).c_str());
}else{
long long quo1 = a1*b2;
long long quo2 = b1*a2;
if(a2 < 0){
quo1 = -quo1;
quo2 = -quo2;
}
printf("%s / %s = %s\n", format(a1, b1).c_str(), format(a2, b2).c_str(), format(quo1, quo2).c_str());
}
return 0;
}