【高精度运算】

来源:互联网 发布:莱纳德 知乎 编辑:程序博客网 时间:2024/04/29 21:34

虽说高精度直接考查的越来越少,不过还是以防万一。

#define maxlen 1000struct bint{    int len,s[maxlen];    bint(){len=1;memset(s,0,sizeof(s));}    //*******本模板既可输入字符串,也可输入整数*******//    bint(int t){    memset(s,0,sizeof(s));len=1;    while(t){s[len++]=t%10;t/=10;}    if(len>1)len--;    }    bint(char *str){    memset(s,0,sizeof(s));len=strlen(str);    for(int i=1;i<=len;i++)s[i]=str[len-i]-'0';    }    //print number    friend void print(bint bi){    for(int i=bi.len;i>=1;i--)printf("%d",bi.s[i]);    }    //print number+enter    friend void println(bint bi){    print(bi);printf("\n");    }    //可作连=运算    bint operator=(int t){    len=1;if(t==0){s[1] = 0;return *this;}    while(t){s[len++]=t%10;t/=10;}    len--;    return *this;    }    bint operator=(char *str){    len=strlen(str);    for(int i=1;i<=len;i++)s[i]=str[len-i]-'0';    return *this;    }    friend int cmp(const bint &a,const bint &b){    //a>b返回正数,a==b返回0,a<b返回负数    if(a.len!=b.len)return a.len-b.len;    for(int i=a.len;i>0;i--)    if(a.s[i]!=b.s[i])return a.s[i]-b.s[i];    return 0;    }    //*******加法*******//    bint operator+(const bint &bi){    int i; bint c;    for(i=1;i<=len || i<=bi.len || c.s[i];i++){    c.s[i]+=s[i]+bi.s[i];    c.s[i+1]=c.s[i]/10;c.s[i]%=10;    }    if(i>1)c.len=i-1;    return c;    }    //*******减法*******//    bint operator-(const bint &bi){//只考虑a>=b,不考虑负数    int i,j; bint c;    for(i=1,j=0;i<=len;i++){    c.s[i]=s[i]-j;if(i<=bi.len)c.s[i]-=bi.s[i];    if(c.s[i]<0){j=1;c.s[i]+=10;}else j=0;    }    c.len=len;while(c.len>1 && !c.s[c.len])c.len--;    return c;    }    //*******乘法*******//    bint operator*(const bint &bi){    int i,j;bint c;c.len=len+bi.len;    for(i=1;i<=len;i++)    for(j=1;j<=bi.len;j++)c.s[i+j-1]+=s[i]*bi.s[j];    for(i=1;i<c.len || c.s[i];i++){    c.s[i+1]+=c.s[i]/10;c.s[i]%=10;    }    while(i>1 && !c.s[i])i--;c.len=i;    return c;    }    //*******除法*******//    bint operator/(const bint &bi){    int i,j;bint d,c;    for(i=len;i>0;i--){    if(!(d.len==1 && d.s[1]==0)){    for(j=d.len;j>0;j--)d.s[j+1]=d.s[j];    ++d.len;            }    d.s[1]=s[i];    while((j=cmp(d,bi))>=0){    d=d-bi;c.s[i]++;    if(j==0)break;            }        }    c.len=len;    while(c.len>1 && c.s[c.len]==0)c.len--;    return c;    }    //*******取余*******//    bint operator%(const bint &bi){    int i,j;bint d;    for(i=len;i>0;i--){    if(!(d.len==1 && d.s[1]==0)){    for(j=d.len;j>0;j--)d.s[j+1]=d.s[j];    ++d.len;        }    d.s[1]=s[i];    while((j=cmp(d,bi))>=0){d=d-bi;if(j==0)break;}        }    return d;    }    //*******次方*******//    bint pow(int exp){    bint ret = 1, t = (*this);    while (exp){    if (exp & 1)    ret = ret * t;    exp >>= 1; t = t * t;        }    return ret;    }};bint a,b;int main(){    char s1[100],s2[100];    scanf("%s%s",s1,s2);    a=bint(s1),b=bint(s2);    println(a+b);    println(a-b);//a>=b    println(a*b);    println(a/b);    println(a.pow(3));    return 0;}

原创粉丝点击