高精度模板(重载运算符)

重载运算符,应该是最方便写和调用的高精度写法了。

代码:

struct haa
{
    int len,a[N];
    haa(){len=1;memset(a,0,sizeof(a));}
    haa(ll x){while(x) a[++len]=x%10,x/=10;}
};
char s[N];
inline haa read_haa()
{
    haa ret;
    scanf("%s",s+1);
    ret.len=strlen(s+1);
    for(int i=ret.len;i>=1;i--) ret.a[i]=s[ret.len-i+1]-(int)'0';
    return ret;
}
inline void print_haa(const haa ret)
{
    for(int i=ret.len;i>=1;i--)
        printf("%d",ret.a[i]);
    putchar('\n');
}
inline haa operator + (const haa &x,const haa &y)//高精+高精
{
    haa ret; ret.len=max(x.len,y.len)+1;
    int up=0;
    for(int i=1;i<=ret.len;i++)   
    {
        ret.a[i]=(up+x.a[i]+y.a[i]);
        up=ret.a[i]/10;
        ret.a[i]%=10;
    }
    while(ret.len>1&&!ret.a[ret.len]) ret.len--;
    return ret;
}
inline haa operator / (const haa &x,const ll &y)//高精/低精
{
    haa ret; ret.len=x.len;
    ll down=0ll;//这里别忘了开 long long
    for(int i=ret.len;i>=1;i--)
    {
        ret.a[i]=(down*10+x.a[i])/y;
        down=(down*10+x.a[i])%y;
    }
    while(ret.len>1&&!ret.a[ret.len]) ret.len--;
    return ret;
}
inline haa operator * (const haa &x,const haa &y)//高精*高精
{
    haa ret; ret.len=x.len+y.len;
    for(int i=1;i<=x.len;i++)   
        for(int j=1;j<=y.len;j++)   
            ret.a[i+j-1]+=x.a[i]*y.a[j];
    int up=0;
    for(int i=1;i<=ret.len;i++)
    {
        ret.a[i]+=up;
        up=ret.a[i]/10;
        ret.a[i]%=10;
    }
    while(ret.len>1&&!ret.a[ret.len]) ret.len--;
    return ret;
}
posted @ 2021-10-21 17:06  conprour  阅读(137)  评论(0编辑  收藏  举报