[没啥用科技] C++ 分数类

虽然说用的是结构体,但已经实现了同类型加减乘除和分数与整型的加减乘除。

写的有点难看,并伴有大常数,以后来改。

可能有点小问题,目前不知道在哪,反正我拿来写高斯约旦写挂了。

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define ll long long
#define ldb long double
#define m_p(a, b) make_pair(a, b)
using namespace std;
using namespace __gnu_pbds;
int _lcm(int x, int y)
{
	return x / __gcd(x, y) * y;
}
struct myr
{
	int son, ma;
	int vali;
	ldb valr;
	myr()
	{
		son = 0;
		ma = 1;
		vali = 0;
		valr = 0;
	}

	myr operator+(myr B)
	{
		myr A;
		A.ma = _lcm(ma, B.ma);
		son *= (A.ma / ma);
		B.son *= (A.ma / B.ma);
		A.son = son + B.son;
		int smg = __gcd(A.son, A.ma);
		A.son /= smg;
		A.ma /= smg;
		if (A.ma < 0)
		{
			A.son = -A.son;
			A.ma = -A.ma;
		}
		A.vali = A.son / A.ma;
		A.valr = (A.son * 1.0) / (A.ma * 1.0);
		return A;
	}
	myr operator*(myr B)
	{
		myr A;
		int g1 = __gcd(ma, B.son), g2 = __gcd(B.ma, son);
		A.son = son / g2 * B.son / g1;
		A.ma = ma / g1 * B.ma / g2;
		if (A.ma < 0)
		{
			A.son = -A.son;
			A.ma = -A.ma;
		}
		A.vali = A.son / A.ma;
		A.valr = (A.son * 1.0) / (A.ma * 1.0);
		return A;
	}
	myr operator+(int b)
	{
		myr B;
		B.son = b;
		return *this + B;
	}
	myr operator-(int b)
	{
		myr B;
		B.son = -b;
		return *this + B;
	}
	myr operator*(int b)
	{
		myr B;
		B.son = b;
		return *this * B;
	}
	myr operator/(int b)
	{
		myr B;
		B.ma = b;
		return *this * B;
	}
	myr operator/(myr B)
	{
		if (!B.son)
			assert(0);
		swap(B.son, B.ma);
		return *this * B;
	}
	myr operator-(myr B)
	{
		B.son = -B.son;
		return *this + B;
	}
	bool operator==(myr B)
	{
		return son == B.son && ma == B.ma;
	}
	bool operator!=(myr B)
	{
		return !(*this == B);
	}
	bool operator<(myr B)
	{
		return valr < B.valr;
	}
	bool operator>(myr B)
	{
		return valr > B.valr;
	}
	bool operator<=(myr B)
	{
		if (valr < B.valr)
			return 1;
		else
			return *this == B;
	}
	bool operator>=(myr B)
	{
		if (valr > B.valr)
			return 1;
		else
			return *this == B;
	}
};
myr mkr(int x)
{
	myr A;
	A.ma = 1;
	A.son = x;
	A.vali = x;
	A.valr = x;
	return A;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	// freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	return 0;
}
posted @ 2024-02-28 22:39  -wryyy-  阅读(16)  评论(0编辑  收藏  举报