高精度模板

2018-10-31 10:25:05


高精度板子,封装hll

struct hll
{
    int v[maxn],len;
    hll()
    {
        v[1]=0;//memset(v,0,sizeof(v));
        len=1;
    }
    hll(char *ss)
    {
        *this=ss;
    }
    hll(long long t)
    {
        *this=t;
    }
    hll(int t)
    {
        *this=t;
    }
    hll& operator = (const char *ss)
    {
        len=strlen(ss);
        for(register int i=0;i<len;i++)
            v[len-i]=ss[i]-48;
        return *this;
    }
    hll& operator = (const long long& t)
    {
        len=1;
        if(t==0){v[len]=0;return *this;}
        long long ss=t;
        while(ss)
        {
            v[len++]=ss%10;
            ss/=10;
        }
        len--;
        return *this;
    }
    hll& operator = (const int& t)
    {
        len=1;
        if(t==0){v[len]=0;return *this;}
        int ss=t;
        while(ss)
        {
            v[len++]=ss%10;
            ss/=10;
        }
        len--;
        return *this;
    }
    hll& operator = (const hll& t)
    {
        len=t.len;
        for(register int i=1;i<=len;i++)
            v[i]=t.v[i];
        return *this;
    }
    inline bool operator == (const hll& t)
    {
        if(t.len>len||len>t.len)return 0;
        for(register int i=1;i<=len;i++)
            if(v[i]!=t.v[i])return 0;
        return 1;
    }
    inline bool operator < (const hll& rhs) const
    {
        if(rhs.len>len)return 1;
        if(rhs.len<len)return 0;
        for(register int i=len;i>0;i--)
        {
            if(v[i]<rhs.v[i])return 1;
            if(v[i]>rhs.v[i])return 0;
        }
        return 0;
    }
    hll operator + (const hll& t)
    {
        hll ans;
        ans.len=max(t.len,len);
        for(register int i=1;i<=ans.len+1;i++)ans.v[i]=0;
        for(register int i=1;i<=ans.len;i++)
        {
            if(i<=len&&i<=t.len)ans.v[i]+=v[i]+t.v[i];
            else if(i>len)ans.v[i]+=t.v[i];
            else ans.v[i]+=v[i];
            if(ans.v[i]>=10)ans.v[i+1]++,ans.v[i]-=10;  
        }
        if(ans.v[ans.len+1])ans.len++;
        return ans;
    } 
    hll operator * (const hll& t)
    {
        hll ans;
        ans.len=len+t.len;
        for(register int i=1;i<=ans.len;i++)ans.v[i]=0;
        for(register int i=1;i<=len;i++)
            for(register int j=1;j<=t.len;j++)
            {
                ans.v[i+j-1]+=v[i]*t.v[j];
                if(ans.v[i+j-1]>=10)
                {
                    ans.v[i+j]+=ans.v[i+j-1]/10;
                    ans.v[i+j-1]%=10;
                }
            }
        while(ans.v[ans.len]>=10)ans.v[ans.len+1]=ans.v[ans.len]/10,ans.v[ans.len]%=10,ans.len++;
        while(ans.v[ans.len]==0&&ans.len>1)ans.len--;
        return ans;
    }
    hll operator / (const long long &t)
    {
        hll tmp=*this,ans;
        ans.len=len;for(register int i=1;i<=ans.len;i++)ans.v[i]=0;
        for(register int i=len;i>0;i--)
        {
            if(tmp.v[i]<t)tmp.v[i-1]+=(tmp.v[i]<<1)+(tmp.v[i]<<3);
            else
            {
                ans.v[i]=tmp.v[i]/t;
                tmp.v[i]%=t;
                tmp.v[i-1]+=(tmp.v[i]<<1)+(tmp.v[i]<<3);
            }
        }
        while(ans.v[ans.len]==0&&ans.len>1)ans.len--;
        return ans;
    }
    inline void print()
    {
        for(register int i=len;i>0;i--)
            putchar(v[i]+48);
    }
};