example1
& https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct {
long long a;//分子
long long b;//分母
}Fraction;
long long getGcd(long long a, long long b) {
if (b == 0) {
return a;
}
else {
return getGcd(b, a % b);
}
}
void simplification(Fraction& fraction) {
//化简
// if(fraction.a == 0){
// //0,为方便将分母化为1
// fraction.b = 1;
// return;
// }
//先找最大公约数
long long gcd = getGcd(fraction.a, fraction.b);
fraction.a /= gcd;//都除以最大公约数
fraction.b /= gcd;
}
void toSameDenominator(Fraction& fraction1, Fraction &fraction2) {
long long tempFraction1B = fraction1.b;
fraction1.a *= fraction2.b;
fraction1.b *= fraction2.b;
fraction2.a *= tempFraction1B;
fraction2.b *= tempFraction1B;
}
Fraction add(Fraction fraction1, Fraction fraction2) {
toSameDenominator(fraction1, fraction2);
Fraction result;
result.a = fraction1.a + fraction2.a;
result.b = fraction1.b;
simplification(result);
return result;
}
Fraction myMinus(Fraction fraction1, Fraction fraction2) {
toSameDenominator(fraction1, fraction2);
Fraction result;
result.a = fraction1.a - fraction2.a;
result.b = fraction1.b;
simplification(result);
return result;
}
Fraction multiplication(Fraction fraction1, Fraction fraction2) {
Fraction result;
result.a = fraction1.a * fraction2.a;
result.b = fraction1.b * fraction2.b;
simplification(result);
return result;
}
Fraction division(Fraction fraction1, Fraction fraction2) {
Fraction result;
result.a = fraction1.a * fraction2.b;
result.b = fraction1.b * fraction2.a;//if fraction2.a==0,result.b==0
simplification(result);
return result;
}
void adjustNegative(Fraction& fraction) {
//若符号在分母,将其调整到分子
if (fraction.b < 0) {
fraction.a = -fraction.a;
fraction.b = -fraction.b;
}
}
void showEachResult(Fraction fraction) {
if (fraction.a < 0) {
cout << "(";
}
if (fraction.b == 1) {//分母为0
printf("%lld", fraction.a);
}
else {
if (abs(fraction.a) > fraction.b) {
//分子大于分母,假分数
printf("%lld %lld/%lld", fraction.a / fraction.b, abs(fraction.a)%fraction.b, fraction.b);
}
else {
//真分数
printf("%lld/%lld", fraction.a, fraction.b);
}
}
if (fraction.a < 0) {
cout << ")";
}
}
void showResult(Fraction fraction1, char op, Fraction fraction2, Fraction result) {
adjustNegative(fraction1);
adjustNegative(fraction2);
adjustNegative(result);
showEachResult(fraction1);
printf(" %c ", op);
showEachResult(fraction2);
printf(" = ");
if (result.b == 0) {
printf("Inf");
}else {
showEachResult(result);
}
printf("\n");
}
int main() {
Fraction fraction1, fraction2;
scanf_s("%lld/%lld %lld/%lld", &fraction1.a, &fraction1.b, &fraction2.a, &fraction2.b);
// adjustNegative(fraction1);
// adjustNegative(fraction2);
simplification(fraction1);
simplification(fraction2);
Fraction addResult = add(fraction1, fraction2);
showResult(fraction1, '+', fraction2, addResult);
Fraction minusResult = myMinus(fraction1, fraction2);
showResult(fraction1, '-', fraction2, minusResult);
Fraction multiplicationResult = multiplication(fraction1, fraction2);
showResult(fraction1, '*', fraction2, multiplicationResult);
Fraction divisionResult = division(fraction1, fraction2);
showResult(fraction1, '/', fraction2, divisionResult);
return 0;
}