高精度模板

· · 个人记录

定义高精度:

struct ll{
    char s[10001];//字符串定义
    int a[10001],flag;//数字以及符号
    void clear()//初始化
    {
        memset(s,0,10001);
        memset(a,0,40004);
        *a=1,flag=1;
    }
    void in()//输入
    {
        scanf("%s",s);
        if(isdigit(*s))
        {
            flag=1,a[0]=strlen(s);
            for(int i=0;i<*a;++i)
                a[*a-i]=s[i]-48;
        }
        else//处理负数
        {
            flag=(*s=='-'?-1:1),a[0]=strlen(s)-1;
            for(int i=1;i<=*a;++i)
                a[*a-i+1]=s[i]-48;
        }
    }
    void out()//输出
    {
        if(!flag)
        {
            puts("INF"),flag=1;//处理除法或者模运算除以0
            return;
        }
        if(!~flag) printf("-");//是负数输出符号
        for(int i=*a;i;--i)
            printf("%d",a[i]);
        puts("");
    }
    void sin(long long x)//低精转高精
    {
        clear(),a[0]=0;
        if(x<0) flag=-1,x=-x;
        else flag=1;
        while(x)
            a[++*a]=x%10,x/=10;
    }
    void sout(long long &x)//高精转低精
    {
        for(int i=*a;i>0;--i)
            x=x*10+a[i];
        if(!~flag) x=-x;
    }
    int& operator [](const int &n)//运用数组运算符,方便访问数组元素
    {
        if(!~n) return flag;
        return a[n];
    }
};

一波定义高精度运算:

bool operator <(ll a,ll b);
bool operator >(ll a,ll b);
bool operator <=(ll a,ll b);
bool operator >=(ll a,ll b);
bool operator !=(ll a,ll b);
bool operator ==(ll a,ll b);
ll operator +(ll a,ll b);
ll operator -(ll a,ll b);
ll operator *(ll a,ll b);
ll operator /(ll a,ll b);
ll operator %(ll a,ll b);
ll& operator +=(ll &a,ll &b);
ll& operator -=(ll &a,ll &b);
ll& operator *=(ll &a,ll &b);
ll& operator /=(ll &a,ll &b);
ll& operator %=(ll &a,ll &b);
bool operator <(long long a,ll b);
bool operator >(long long a,ll b);
bool operator <=(long long a,ll b);
bool operator >=(long long a,ll b);
bool operator !=(long long a,ll b);
bool operator ==(long long a,ll b);
ll operator +(long long a,ll b);
ll operator -(long long a,ll b);
ll operator *(long long a,ll b);
ll operator /(long long a,ll b);
ll operator %(long long a,ll b);
bool operator <(ll a,long long b);
bool operator >(ll a,long long b);
bool operator <=(ll a,long long b);
bool operator >=(ll a,long long b);
bool operator !=(ll a,long long b);
bool operator ==(ll a,long long b);
ll operator +(ll a,long long b);
ll operator -(ll a,long long b);
ll operator *(ll a,long long b);
ll operator /(ll a,long long b);
ll operator %(ll a,long long b);
ll& operator +=(ll &a,long long b);
ll& operator -=(ll &a,long long b);
ll& operator *=(ll &a,long long b);
ll& operator /=(ll &a,long long b);
ll& operator %=(ll &a,long long b);

高精度运算:

bool operator <(ll a,ll b)
{
    if(!~a[-1]&&~b[-1]) return 1;
    if(~a[-1]&&!~b[-1]) return 0;
    if(!~a[-1]&&!~b[-1])
    {
        a[-1]=b[-1]=1;
        return a>b;
    }
    if(a[0]<b[0]) return 1;
    if(a[0]>b[0]) return 0;
    for(int i=a[0];i>0;--i)
    {
        if(a[i]<b[i]) return 1;
        if(a[i]>b[i]) return 0;
    }
    return 0;
}
bool operator >(ll a,ll b)
{
    if(!~a[-1]&&~b[-1]) return 0;
    if(~a[-1]&&!~b[-1]) return 1;
    if(!~a[-1]&&!~b[-1])
    {
        a[-1]=b[-1]=1;
        return a<b;
    }
    if(a[0]<b[0]) return 0;
    if(a[0]>b[0]) return 1;
    for(int i=a[0];i>0;--i)
    {
        if(a[i]<b[i]) return 0;
        if(a[i]>b[i]) return 1;
    }
    return 0;
}
bool operator <=(ll a,ll b)
{
    return !(a>b);
}
bool operator >=(ll a,ll b)
{
    return !(a<b);
}
bool operator !=(ll a,ll b)
{
    return a>b||a<b;
}
bool operator ==(ll a,ll b)
{
    return !(a!=b);
}
ll operator +(ll a,ll b)
{
    ll c;
    c.clear();
    if(!~a[-1]&&!~b[-1])
    {
        a[-1]=b[-1]=1;
        c=a+b,c[-1]=-1;
        return c;
    }
    if(!~a[-1])
    {
        a[-1]=1;
        c=b-a;
        return c;
    }
    if(!~b[-1])
    {
        b[-1]=1;
        c=a-b;
        return c;
    }
    c[0]=max(a[0],b[0]);
    for(int i=1;i<=c[0];++i)
        c[i]=a[i]+b[i];
    for(int i=1;i<=c[0];++i)
        c[i+1]+=c[i]/10,c[i]%=10;
    if(c[c[0]+1]) ++c[0];
    return c;
}
ll& operator +=(ll &a,ll &b)
{
    a=a+b;
    return a;
}
ll operator -(ll a,ll b)
{
    ll c;
    c.clear();
    if(!~a[-1])
    {
        a[-1]=1;
        c=a+b,c[-1]=-c[-1];
        return c;
    }
    if(!~b[-1])
    {
        b[-1]=1;
        c=a+b;
        return c;
    }
    if(a<b)
    {
        c=b-a,c[-1]=-1;
        return c;
    }
    c=a;
    for(int i=1;i<=c[0];++i)
    {
        c[i]-=b[i];
        if(c[i]<0)
            --c[i+1],c[i]+=10;
    }
    while(!c[c[0]]&&c[0]>1) --c[0];
}
ll& operator -=(ll &a,ll &b)
{
    a=a-b;
    return a;
}
ll operator *(ll a,ll b)
{
    ll c;
    int x;
    c.clear();
    if(a[-1]!=b[-1])
    {
        a[-1]=b[-1]=1;
        c=a*b,c[-1]=-1;
        return c;
    }
    c[0]=a[0]+b[0],a[-1]=b[-1]=1;
    for(int i=1;i<=a[0];++i)
    {
        x=0;
        for(int j=1;j<=b[0];++j)
        {
            c[i+j-1]+=a[i]*b[j]+x;
            x=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
        c[i+b[0]]=x;
    }
    while(!c[c[0]]&&c[0]>1) --c[0];
    return c;
}
ll& operator *=(ll &a,ll &b)
{
    a=a*b;
    return a;
}
ll operator /(ll a,ll b)
{
    ll c,t;
    c.clear();
    if(b==0)
    {
        c[-1]=0;
        return c;
    }
    if(a[-1]!=b[-1])
    {
        a[-1]=b[-1]=1;
        c=a/b,c[-1]=-1;
        return c;
    }
    c[0]=a[0]-b[0]+1,a[-1]=b[-1]=1;
    if(c[0]<1)
    {
        c[0]=1;
        return c;
    }
    for(int i=c[0];i>0;--i)
    {
        t.clear();
        for(int j=1;j<=b[0];++j)
            t[i+j-1]=b[j];
        t[0]=i+b[0]-1;
        while(a>=t) ++c[i],a-=t;
    }
    while(!c[c[0]]&&c[0]>1) --c[0];
    return c;
}
ll& operator /=(ll &a,ll &b)
{
    a=a/b;
    return a;
}
ll operator %(ll a,ll b)
{
    ll c,t;
    int d=1;
    c.clear();
    if(!~a[-1]) d=-1;
    if(b==0)
    {
        a[-1]=0;
        return a;
    }
    if(a[-1]!=b[-1])
    {
        a[-1]=b[-1]=1;
        c=a%b,c[-1]=d;
        return c;
    }
    c[0]=a[0]-b[0]+1,a[-1]=b[-1]=1;
    if(c[0]<1)
    {
        c[0]=1;
        return a;
    }
    for(int i=c[0];i>0;--i)
    {
        t.clear();
        for(int j=1;j<=b[0];++j)
            t[i+j-1]=b[j];
        t[0]=i+b[0]-1;
        while(a>=t) ++c[i],a-=t;
    }
    while(!c[c[0]]&&c[0]>1) --c[0];
    a[-1]=d;
    return a;
}
ll& operator %=(ll &a,ll &b)
{
    a=a%b;
    return a;
}
bool operator <(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x<b;
}
bool operator >(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x>b;
}
bool operator <=(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x<=b;
}
bool operator >=(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x>=b;
}
bool operator !=(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x!=b;
}
bool operator ==(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x==b;
}
ll operator +(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x+b;
}
ll operator -(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x-b;
}
ll operator *(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x*b;
}
ll operator /(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x/b;
}
ll operator %(long long a,ll b)
{
    ll x;
    x.sin(a);
    return x%b;
}
bool operator <(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a<x;
}
bool operator >(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a>x;
}
bool operator <=(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a<=x;
}
bool operator >=(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a>=x;
}
bool operator !=(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a!=x;
}
bool operator ==(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a==x;
}
ll operator +(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a+x;
}
ll operator -(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a-x;
}
ll operator *(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a*x;
}
ll operator /(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a/x;
}
ll operator %(ll a,long long b)
{
    ll x;
    x.sin(b);
    return a%x;
}
ll& operator +=(ll &a,long long b)
{
    a=a+b;
    return a;
}
ll& operator -=(ll &a,long long b)
{
    a=a-b;
    return a;
}
ll& operator *=(ll &a,long long b)
{
    a=a*b;
    return a;
}
ll& operator /=(ll &a,long long b)
{
    a=a/b;
    return a;
}
ll& operator %=(ll &a,long long b)
{
    a=a%b;
    return a;
}
ll& operator ++(ll &a)
{
    a+=1;
    return a;
}
ll& operator --(ll &a)
{
    a-=1;
    return a;
}
istream& operator >>(istream& is,ll &x)
{
    x.in();
    return is;
}
ostream& operator <<(ostream& os,ll &x)
{
    x.out();
    return os;
}