有关重载 >>
  • 板块学术版
  • 楼主XiaoQuQu
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/4/24 06:47
  • 上次更新2023/11/5 00:11:50
查看原帖
有关重载 >>
427623
XiaoQuQu楼主2021/4/24 06:47

请问我这个重载 >> 有哪里错了,现在很搞不懂。

#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;
}
2021/4/24 06:47
加载中...