大整数类-高精度模板

来源:互联网 发布:淘宝淘口令有危险吗 编辑:程序博客网 时间:2024/06/05 19:42

在大部分oier看来,只要有高精度的题就是毒瘤题(雾),之前的我遇到高精度的题就直接弃疗了,但是如果考试考到,这些分就白丢了,所以说抽出时间整理了一下高精度模板,主要包括:高精加,高精减,高精乘,高精除单精

先说说如何定义:

struct bigint{    int s[10100];    int len;    bool zf;    bigint()    {        memset(s,0,sizeof(s));        len=0;        zf=0;    }    void init()    {        len=strlen(ch);        if (ch[1]=='-')        {            zf=1;            for (int i=2;i<=len;i++)                s[i]=ch[len-i]-'0';        }        else        {            for (int i=1;i<=len;i++)                s[i]=ch[len-i]-'0';        }    }    void reverse()    {        int t[10010];        for (int i=1;i<=len;i++)            t[i]=s[len-i+1];        for (int i=1;i<=len;i++)            s[i]=t[i];    }    void uni()    {        while (s[len]==0&&len>1)len--;     }    void pr()    {        for (int i=len;i>=1;i--) printf("%d",s[i]);    }};

init是反着存数,uni是去掉前导零,reverse是翻转,pr是输出答案,为什么要翻转呢?因为除了除法其他操作都是从低到高,为了方便直观理解,我们可以再除法操作之前先reverse再除再reverse(其实是懒得处理下标问题)

加法:

bigint operator +(bigint x,bigint y){    bigint nw;    nw.len=max(x.len,y.len);    for (int i=1;i<=nw.len;i++)    {        nw.s[i]+=x.s[i]+y.s[i];        nw.s[i+1]+=nw.s[i]/10;        nw.s[i]%=10;    }    if (nw.s[nw.len+1]>0) nw.len++;    return nw;}

减法:

bool operator >(bigint x,bigint y){    if (x.len>y.len) return 1;    else if (x.len<y.len) return 0;    int nw=x.len;    while (nw)    {        if (x.s[nw]>y.s[nw]) return 1;        else if (x.s[nw]<y.s[nw]) return 0;        nw--;    }    if (nw==0) return 1;    return 1; }bigint operator -(bigint x,bigint y){    bigint nw;    nw.len=max(x.len,y.len);    for (int i=1;i<=nw.len;i++)    {        nw.s[i]+=x.s[i]-y.s[i];        if (nw.s[i]<0) nw.s[i+1]--,nw.s[i]+=10;    }    while (nw.s[nw.len]==0&&nw.len>1)nw.len--;    return nw;}

这里有个技巧:(这里只写了a,b都是正数的比较函数)

if (a>b)    {        a=a-b;    }    else a=b-a,printf("-");    a.pr();

这样可以避免减出负数

乘法:

bigint operator *(bigint x,bigint y){    bigint nw;    nw.len=x.len+y.len;    for (int i=1;i<=x.len;i++)        for (int j=1;j<=y.len;j++)        {            nw.s[i+j-1]+=x.s[i]*y.s[j];            nw.s[i+j]+=nw.s[i+j-1]/10;            nw.s[i+j-1]%=10;        }    while (nw.s[nw.len]==0&&nw.len>1)nw.len--;    return nw;}

高精除单精:

bigint operator /(bigint x,int y){    bigint sh;    int nv=0;    for (int i=1;i<=x.len;i++)    {        nv=nv*10+x.s[i];        sh.s[++sh.len]=nv/y;        nv=nv%y;    }    return sh;}

这种东西只要细心相信大家都可以写出来,这里的模板只是供大家参考,最好是自己写一下