请问我这个重载 >> 有哪里错了,现在很搞不懂。
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int GreatestCommonDivisor(int x, int y) {
if (x % y == 0) {
return y;
}
else {
return GreatestCommonDivisor(y, x % y);
}
}
int LeastCommonMultiple(int x, int y) {
int numberProduct = x * y, numberDivisor = GreatestCommonDivisor(x, y);
return numberProduct / numberDivisor;
}
typedef struct fraction {
int numerator = 0, denominator = 0;
bool operator < (const fraction f) const {
int f_numerator, t_numerator, f_denominator, t_denominator;
f_numerator = f.numerator;
t_numerator = numerator;
f_denominator = f.denominator;
t_denominator = denominator;
if (f_denominator == t_denominator) {
return t_numerator < f_numerator;
}
if (f_numerator == t_numerator) {
return t_denominator > f_denominator;
}
fraction t_temp, f_temp;
t_temp = *this; f_temp = f;
int minMultiple = LeastCommonMultiple(t_temp.denominator, f_temp.denominator);
int gain = minMultiple / t_temp.denominator;
t_temp.denominator *= gain;
t_temp.numerator *= gain;
f_temp.denominator *= gain;
f_temp.numerator *= gain;
if (t_temp.numerator < f_temp.numerator) {
return true;
}
else {
return false;
}
}
bool operator == (const fraction f) const{
return f.denominator == denominator && f.numerator == numerator;
}
bool operator <= (const fraction f) const {
if (f < *this || f == *this) {
return true;
}
else {
return false;
}
}
bool operator > (const fraction f) const {
int f_numerator, t_numerator, f_denominator, t_denominator;
f_numerator = f.numerator;
t_numerator = numerator;
f_denominator = f.denominator;
t_denominator = denominator;
if (f_denominator == t_denominator) {
return t_numerator > f_numerator;
}
if (f_numerator == t_numerator) {
return t_denominator < f_denominator;
}
fraction t_temp, f_temp;
t_temp = *this; f_temp = f;
int minMultiple = LeastCommonMultiple(t_temp.denominator, f_temp.denominator);
int gain = minMultiple / t_temp.denominator;
t_temp.denominator *= gain;
t_temp.numerator *= gain;
f_temp.denominator *= gain;
f_temp.numerator *= gain;
return t_temp.numerator > f_temp.numerator;
}
bool operator >= (const fraction f) const {
return f > *this || f == *this;
}
fraction operator + (const fraction f) const {
fraction f_temp = f, t_temp = *this, ans;
if (f_temp.denominator == t_temp.denominator) {
ans.denominator = f_temp.denominator;
ans.numerator = f_temp.numerator + t_temp.numerator;
return ans;
}
int minMultiple = LeastCommonMultiple(t_temp.denominator, f_temp.denominator);
int gain = minMultiple / t_temp.denominator;
t_temp.denominator *= gain;
t_temp.numerator *= gain;
f_temp.denominator *= gain;
f_temp.numerator *= gain;
ans.denominator = f_temp.denominator;
ans.numerator = f_temp.numerator + t_temp.numerator;
int maxDivisor = GreatestCommonDivisor(ans.denominator, ans.numerator);
if (maxDivisor != 1) {
ans.denominator /= maxDivisor;
ans.numerator /= maxDivisor;
}
return ans;
}
friend ostream& operator << (ostream& out, const fraction f) {
out << f.numerator << "/" << f.denominator;
return out;
}
friend istream& operator >> (istream& in, fraction f) {
string str;
in >> str;
int pos = str.find("/");
if (pos == string::npos) {
throw -1001;
return in;
}
int tmpd = 0, tmpt = 0;
for (register int i = 0; i < pos; ++i) {
tmpt *= 10;
tmpt += str[i] - '0';
}
for (register int i = pos + 1; i < str.length(); ++i) {
tmpd *= 10;
tmpd += str[i] - '0';
}
f.denominator = tmpd, f.numerator = tmpt;
printf("%d %d\n", f.numerator, f.denominator);
return in;
}
};
int main(void) {
//test < op
fraction test1, test2;
cin >> test1 >> test2;
printf("%d %d\n", test1.numerator, test1.denominator);
cout << test1 + test2;
return 0;
}