C++高精度模板

来源:互联网 发布:网络运营工程师做什么 编辑:程序博客网 时间:2024/06/06 06:44

很好的C++高精度模板,本文均为原创。如发现BUG,请留言,感谢。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cstdlib>using namespace std;struct bignum{    string s;    string delzero()//去前导0    {        for(int i=0;i<s.size();i++)        {            if(s[i]!=48)            {                s=s.substr(i,s.size()-i);                return s;            }        }        s="0";        return s;    }    string align(string s,int len)//加减法的位对齐    {        for(int i=s.size();i<len;i++)            s=(char)48+s;        return s;    }    bignum()    {        s="";    }    bignum(int num)    {        *this=num;    }    bignum operator =(int num)    {        char ss[100];        sprintf(ss,"%d",num);        s=ss;        return *this;    }    bignum operator +(bignum b)//加    {        bignum c;int jin=0;        int len=s.size()>=b.s.size()?s.size():b.s.size();        s=align(s,len);b.s=align(b.s,len);        for(int i=s.size()-1;i>=0;i--)        {            c.s=(char)((s[i]+b.s[i]+jin-96)%10+48)+c.s;            jin=(s[i]+b.s[i]+jin-96)/10;        }        if(jin) c.s=(char)(jin+48)+c.s;        return c;    }    bignum operator -(bignum b)//减(小数减大数会返回差的绝对值)    {        bignum c;int jie=0;        if(*this<b)            return b-*this;        int len=s.size()>=b.s.size()?s.size():b.s.size();        b.s=align(b.s,len);        for(int i=s.size()-1;i>=0;i--)        {            char d=(s[i]-b.s[i]-jie)+48;            if(s[i]-b.s[i]-jie<0)            {                d+=10;jie=1;            }            else jie=0;            c.s=d+c.s;        }        return c;    }    bignum operator *(bignum b)//乘    {        bignum a=0;        for(int j=b.s.size()-1;j>=0;j--)        {            bignum c;int jin=0;            for(int i=s.size()-1;i>=0;i--)            {                int t=(s[i]-48)*(b.s[j]-48)+jin;                c.s=(char)(t%10+48)+c.s;                jin=t/10;            }            if(jin) c.s=(char)(jin+48)+c.s;            for(int i=0;i<b.s.size()-1-j;i++)            c.s=c.s+"0";            a+=c;        }        return a;    }    bignum operator /(bignum b)//除    {        bignum c,d;int t,q=0;        d.s=s.substr(0,b.s.size());        if(d<b)        {            d.s=s.substr(0,b.s.size()+1);q++;        }        for(int i=q;i<=s.size()-b.s.size();i++)        {            t=48;            while(d>=b)            {                d-=b;t++;            }            if(s.size()>=i+b.s.size())            {                d.s=d.s+s.substr(i+b.s.size(),1);                d.delzero();c.s=c.s+(char)t;            }        }        return c;    }    bignum operator %(bignum b)//模    {        bignum c=*this/b;        c=*this-c*b;        return c;    }    bignum operator +=(bignum b)//加等    {        *this=*this+b;        return *this;    }    bignum operator -=(bignum b)//减等    {        *this=*this-b;        return *this;    }    bignum operator *=(bignum b)//乘等    {        *this=*this*b;        return *this;    }    bignum operator /=(bignum b)//除等    {        *this=*this/b;        return *this;    }    bignum operator %=(bignum b)//模等    {        *this=*this%b;        return *this;    }    bignum operator ^(bignum b)//乘方    {        bignum d=*this;        for(bignum i=1;i<b;i++)            *this *=d;        return *this;    }    bignum operator !()//阶乘    {        bignum d=1;        for(bignum i=1;i<=*this;i++)            d*=i;        return d;    }    bignum operator ++()//前缀++    {        *this+=1;        return *this;    }    bignum operator --()//前缀--    {        *this-=1;        return *this;    }    bignum operator ++(int)//后缀++    {        *this+=1;        return *this-1;    }    bignum operator --(int)//后缀--    {        *this-=1;        return *this+1;    }    bool operator <(bignum b)//小于    {        delzero(),b.delzero();        if(s.size()!=b.s.size())            return s.size()<b.s.size();        for(int i=0;i<s.size();i++)            if(s[i]!=b.s[i])                return s[i]<b.s[i];        return 0;    }    bool operator >(bignum b)//大于    {        delzero(),b.delzero();        if(s.size()!=b.s.size())            return s.size()>b.s.size();        for(int i=0;i<s.size();i++)            if(s[i]!=b.s[i])                return s[i]>b.s[i];        return 0;    }    bool operator ==(bignum b)//等于    {        return !(*this>b)&&!(*this<b);    }    bool operator !=(bignum b)//不等于    {        return !(*this==b);    }    bool operator <=(bignum b)//小于等于    {        return !(*this>b);    }    bool operator >=(bignum b)//大于等于    {        return !(*this<b);    }};istream& operator >>(istream &in,bignum &x)//输入{    in>>x.s;    x.delzero();    return in;}ostream& operator <<(ostream &out,bignum &x)//输出{    x.delzero();    out<<x.s;    return out;}
1 0
原创粉丝点击