#include <iostream>
#include <cmath>
using namespace std;
class Fraction {
public:
Fraction();
Fraction(int numer, int deno);
Fraction(int numer);
int get_numerator(const Fraction& fraction) { return fraction.numerator_var; } //获取分数的分子
int get_denominator(const Fraction& fraction) { return fraction.denominator_var; } //获取分数的分母
//var1%vq=var2,如果var1小于va
static int max_common_divisor(int var1, int var2) {
return var1 == 0 ? var2 : max_common_divisor(var2 % var1, var1);
}
//输入输出
friend ostream& operator << (ostream& os, const Fraction& fraction);
friend istream& operator >> (istream& is, Fraction& fraction);
//基本运算
friend Fraction operator + (const Fraction& fraction1, const Fraction& fraction2);
friend Fraction operator - (const Fraction& fraction1, const Fraction& fraction2);
private:
int numerator_var, denominator_var; //分子,分母
};
Fraction::Fraction() {
numerator_var = 0;
denominator_var =1;
}
Fraction::Fraction(int numer) {
numerator_var = numer;
denominator_var = 1;
}
//mcd:最大公约数
Fraction::Fraction(int numer, int deno) {
int mcd = Fraction::max_common_divisor(numer, deno);
numerator_var = numer / mcd;
denominator_var = deno / mcd;
}
//cout, fraction
ostream& operator << (ostream& os, const Fraction& fraction) {
bool is_postive = (fraction.numerator_var>=0 && fraction.denominator_var>=0)
|| (fraction.numerator_var<0 && fraction.denominator_var<0);
if (is_postive == false) {
os << "(-" ;
}
if (fraction.denominator_var != 1) {
os << abs(fraction.numerator_var) << "/" << abs(fraction.denominator_var);
} else {
cout << fraction.numerator_var;
}
if (is_postive == false) {
os << ")";
}
return os;
}
//is,fraction
istream& operator >> (istream& is, Fraction& fraction) {
char input[10];
bool is_positive = true;//是否是正分数
bool mid = false;
fraction.numerator_var = fraction.denominator_var = 0;
cin >> input;
for (int i = 0; ; i++) {
if (input[i] == '\0') {
//cout << "input end ";
break;
}
if (input[i] == '-') {
is_positive = !is_positive;//右一个负号位负,两个负号位正
continue;
}
if (input[i] == '/') {
mid = true;
continue;
}
if (mid == false) {
fraction.numerator_var = fraction.numerator_var * 10 + (input[i] - '0');
} else {
fraction.denominator_var = fraction.denominator_var * 10 +(input[i] - '0');
}
}
if (mid == false) {
fraction.denominator_var = 1;
}
//cout << "input_numerator: " << fraction.numerator_var;
//cout << " input_denominator: " << fraction.denominator_var << endl;
int mcd = Fraction::max_common_divisor(fraction.numerator_var, fraction.denominator_var);
fraction.numerator_var = fraction.numerator_var / mcd;
fraction.denominator_var = fraction.denominator_var / mcd;
//cout << "max_common_divisor: " << mcd << endl;
//cout << "numerator: " << fraction.numerator_var;
//cout << " denominator: " << fraction.denominator_var;
if (!is_positive) {
fraction.numerator_var = -fraction.numerator_var;
}
cout << endl;
return is;
}
Fraction operator + (const Fraction& fraction1, const Fraction& fraction2) {
int numer = fraction1.numerator_var*fraction2.denominator_var + fraction2.numerator_var * fraction1.denominator_var;
int deno = fraction1.denominator_var * fraction2.denominator_var;
return Fraction(numer, deno);
}
Fraction operator - (const Fraction& fraction1, const Fraction& fraction2) {
int numer = fraction1.numerator_var*fraction2.denominator_var - fraction2.numerator_var * fraction1.denominator_var;
int deno = fraction1.denominator_var * fraction2.denominator_var;
return Fraction(numer, deno);
}
int main() {
Fraction Fra1(1,4);
Fraction Fra2(2,4);
//cout << Fra1.max_common_divisor(12,6);
cout << "Fraction Fra1 = " << Fra1 << endl;
cout << "Fraction Fra2 = " << Fra2 << endl;
cout << "Fra1 + Fra2 = " << Fra1 - Fra2 << endl;
return 0;
}
`