- 找最大公因数的方法,要用如下gcd函数,如果暴力找最大公因数的话会超时;
- 要用
long long
表示分子分母,不然会超出范围; - 先提取负号,然后分子分母取绝对值,在返回前再把括号和符号加上。
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
//找最大公因数
long long gcd(long long a, long long b) {
if (b == 0)
return a;
else return gcd(b, a%b);
}
/*
分子分母均取绝对值,正负号和括号在最后加上。
*/
string getNum(long long n, long long d) {
string res = "";
if (n == 0)
return "0";
if (d == 0)
return "Inf";
bool negative = n < 0 && d > 0 || n > 0 && d < 0;
n = abs(n), d = abs(d);
long long k = n / d;
n %= d;
long long maxCommonFactor = gcd(n, d);
n /= maxCommonFactor;
d /= maxCommonFactor;
if (k != 0) { //整数部分
res.append(to_string(k));
if (n != 0)
res.append(" ");
}
if (n != 0) {
res += to_string(n) + "/" + to_string(d);
}
if (negative) {
res= "(-" + res+ ")";
}
return res;
}
int main() {
long long n1, d1, n2, d2;
scanf("%lld/%lld %lld/%lld", &n1, &d1, &n2, &d2);
long long n3, d3;
cout << getNum(n1, d1) << " + " << getNum(n2, d2) << " = " << getNum(n1 * d2 + n2 * d1, d1 * d2) << endl;
cout << getNum(n1, d1) << " - " << getNum(n2, d2) << " = " << getNum(n1 * d2 - n2 * d1, d1 * d2) << endl;
cout << getNum(n1, d1) << " * " << getNum(n2, d2) << " = " << getNum(n1 * n2, d1 * d2) << endl;
cout << getNum(n1, d1) << " / " << getNum(n2, d2) << " = " << getNum(n1 * d2, d1 * n2) << endl;
}
二刷:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
long long getLargestCommon(long long a, long long b) {
a = abs(a), b = abs(b);
if (b == 0)
return a;
else return getLargestCommon(b, a % b);
}
string toString(long long numerator, long long denominator) {
if (denominator == 0) {
return "Inf";
}
if (numerator >= 0 && denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
long long largestCommon = getLargestCommon(numerator, denominator);
numerator /= largestCommon;
denominator /= largestCommon;
string res;
long long integer = numerator / denominator;
numerator %= denominator;
if (integer != 0 || numerator == 0) {
res += to_string(integer);
}
if (numerator != 0) {
if (integer != 0) {
res += " ";
numerator = abs(numerator);
}
res += to_string(numerator) + "/" + to_string(denominator);
}
if (integer < 0 || numerator < 0) {
res = "(" + res + ")";
}
return res;
}
int main() {
long long d1, n1, d2, n2;
scanf("%lld/%lld %lld/%lld", &n1, &d1, &n2, &d2);
long long sum, difference;
//sum & subtraction
long long commonDenominator = d1 / getLargestCommon(d1, d2) * d2;
sum = commonDenominator / d1 * n1 + commonDenominator / d2 * n2;
difference = commonDenominator / d1 * n1 - commonDenominator / d2 * n2;
//product & quotient
long long productNumerator, productDenominator, quotientNumerator, quotientDenominator;
productNumerator = n1 * n2;
productDenominator = d1 * d2;
quotientNumerator = n1 * d2;
quotientDenominator = n2 * d1;
string f1 = toString(n1, d1), f2 = toString(n2, d2);
printf("%s + %s = %s\n", f1.c_str(), f2.c_str(), toString(sum, commonDenominator).c_str());
printf("%s - %s = %s\n", f1.c_str(), f2.c_str(), toString(difference, commonDenominator).c_str());
printf("%s * %s = %s\n", f1.c_str(), f2.c_str(), toString(productNumerator, productDenominator).c_str());
printf("%s / %s = %s\n", f1.c_str(), f2.c_str(), toString(quotientNumerator, quotientDenominator).c_str());
}