蒟蒻写了个分数结构体模板,想改成繁分数的,但繁分数好像输出需要递归,计算也很麻烦,这是普通分数的模板
struct frac
{
ll fz,fm;
frac f()//约分
{
ll gcd=__gcd(fz,fm);
return frac{fz/gcd,fm/gcd};
}
friend frac operator +(frac x,frac y)
{
frac ans;
ll lcm=x.fm/__gcd(x.fm,y.fm)*y.fm;
x.fz*=lcm/x.fm,y.fz*=lcm/y.fm;
x.fm=y.fm=lcm;
ans.fz=x.fz+y.fz,ans.fm=lcm;
return ans.f();
}
friend void operator +=(frac &x,frac y)
{
x=x+y;
}
friend frac operator -(frac x,frac y)
{
frac ans;
ll lcm=x.fm/__gcd(x.fm,y.fm)*y.fm;
x.fz*=lcm/x.fm,y.fz*=lcm/y.fm;
x.fm=y.fm=lcm;
ans.fz=x.fz-y.fz,ans.fm=lcm;
return ans.f();
}
friend void operator -=(frac &x,frac y)
{
x=x-y;
}
friend frac operator *(frac x,frac y)
{
frac ans;
ans.fz=x.fz*y.fz,ans.fm=x.fm*y.fm;
return ans.f();
}
friend void operator *=(frac &x,frac y)
{
x=x*y;
}
friend bool operator <(frac x,frac y)//支持sort和greater
{
x=x.f(),y=y.f();
ll lcm=x.fm/__gcd(x.fm,y.fm)*y.fm;
return x.fz*(lcm/x.fm)<y.fz*(lcm/y.fm);
}
friend bool operator >(frac x,frac y)
{
x=x.f(),y=y.f();
ll lcm=x.fm/__gcd(x.fm,y.fm)*y.fm;
return x.fz*(lcm/x.fm)>y.fz*(lcm/y.fm);
}
friend bool operator ==(frac x,frac y)
{
return x.f().fz==y.f().fz&&x.f().fm==y.f().fm;
}
friend bool operator <=(frac x,frac y)
{
return x<y||x==y;
}
friend bool operator >=(frac x,frac y)
{
return x>y||x==y;
}
friend bool operator !=(frac x,frac y)
{
return !(x==y);
}
void print()
{
if(fm!=1) printf("%lld/%lld",fz,fm);
else cout<<fz;
}
void scan()
{
scanf("%lld/%lld",&fz,&fm);
}
template<typename T>
T val()//比如x.val<double>()返回的是分数x的小数值,x.val<int>()返回的则是小于等于x的最大整数(对于非负分数)
{
return T(1.0)*fz/fm;
}
friend istream& operator >>(istream& is,frac &a) {a.scan();return is;}
friend ostream& operator <<(ostream& is,frac &a) {a.print();return is;}//支持cin和cout
};
const frac zero=frac{0,1},one=frac{1,1},inf={LLONG_MAX,1};
繁分数大概是这样
template<typename TX,typename TY>
struct node
{
TX fz;
TY fm;
...
}
蒟蒻不会写,求助