关于分数结构体
查看原帖
关于分数结构体
762928
Runtime_Error754楼主2023/11/3 17:17

蒟蒻写了个分数结构体模板,想改成繁分数的,但繁分数好像输出需要递归,计算也很麻烦,这是普通分数的模板

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;
  ...
}

蒟蒻不会写,求助

2023/11/3 17:17
加载中...