虽然说用的是结构体,但已经实现了同类型加减乘除和分数与整型的加减乘除。
写的有点难看,并伴有大常数,以后来改。
#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;
}
标签:分数,ma,int,myr,C++,son,科技,operator,return
From: https://www.cnblogs.com/wryyy-233/p/18042189