高精度通用模板

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
class bign
{
    private: int d[maxn], len;
    public:
        void clean()
		{
            while(len>1&&!d[len-1]) len--;
        }
        bign()
		{
            memset(d,0,sizeof(d));
            len=1;
        }
        ~bign()
		{
            memset(d,0,sizeof(d));
            len=0;
        }
        bign(int   num)
		{
			*this = num;
		}
        bign(char* num)
		{
			*this = num;
		}
        bign operator = (const char* num)
		{
            memset(d,0,sizeof(d));
            len=strlen(num);
            for(int i = 0; i < len; i++)
			d[i]=num[len-1-i]-'0';
            clean();
            return *this;
        }
        bign operator = (int num)
		{
            char s[2000];
            sprintf(s,"%d",num);
            *this=s;
            return *this;
        }
        bign operator + (const bign& b)
		{
            bign c=*this;
            int i;
            for (i =0;i<b.len;i++)
			{
                c.d[i]+=b.d[i];
                if(c.d[i]>9) c.d[i]%=10,c.d[i+1]++;
            }
            while(c.d[i]>9) c.d[i++]%=10,c.d[i]++;
            c.len = max(len, b.len);
            if (c.d[i]&&c.len<=i) c.len=i+1;
            return c;
        }
        bign operator - (const bign& b)
		{
            bign c = *this;
            int i;
            for (i=0;i<b.len;i++)
			{
                c.d[i] -= b.d[i];
                if(c.d[i]<0) c.d[i]+=10,c.d[i+1]--;
            }
            while(c.d[i]<0) c.d[i++]+=10,c.d[i]--;
            c.clean();
            return c;
        }
        bign operator * (const bign& b)const
		{
            bign c;
            c.len = len + b.len;
            for(int j=0;j<b.len;j++)
            for(int i=0;i<len;i++)
			c.d[i+j]+=d[i]*b.d[j];
            for(int i=0;i<c.len-1;i++)
			c.d[i+1]+=c.d[i]/10,c.d[i]%=10;
            c.clean();
            return c;
        }
        bign operator / (const bign& b)
		{
            bign c=*this,a=0;
            int j;
            for (int i = len - 1; i >= 0; i--)
			{
                a = a*10 + d[i];
                for (j=0;j<10;j++)
				if (a<b*(j+1)) break;
                c.d[i]=j;
                a=a-b*j;
            }
            c.clean();
            return c;
        }
        bign operator % (const bign& b)
		{
            bign a=0;
            int j;
            for (int i = len - 1; i >= 0; i--)
			{
                a=a*10+d[i];
                for(j=0;j<10;j++)
				if(a<b*(j+1)) break;
                a=a-b*j;
            }
            return a;
        }
        bign operator += (const bign& b)
		{
            *this=*this+b;
            return *this;
        }
        bign operator -= (const bign& b)
		{
            *this=*this-b;
            return *this;
        }
        bign operator *= (const bign& b)
		{
            *this=*this*b;
            return *this;
        }
        bign operator /= (const bign& b)
		{
            *this=*this/b;
            return *this;
        }
        bign operator %= (const bign& b)
		{
            *this=*this%b;
            return *this;
        }
        bool operator < (const bign& b) const
		{
            if(len != b.len) return len<b.len;
            for(int i = len-1; i >= 0; i--)
			if(d[i] != b.d[i]) return d[i]<b.d[i];
            return false;
        }
        bool operator > (const bign& b) const
		{
            return b<*this;
        }
        bool operator <=(const bign& b) const
		{
            return !(b<*this);
        }
        bool operator >=(const bign& b) const
		{
            return !(*this<b);
        }
        bool operator !=(const bign& b) const
		{
            return b < *this || *this < b;
        }
        bool operator ==(const bign& b) const
		{
            return !(b<*this)&&!(b>*this);
        }
        string str() const
		{
            char s[maxn]= {};
            for(int i=0; i<len;i++) s[len-1-i] = d[i]+'0';
            return s;
        }
};
istream& operator >> (istream& in, bign& x)
{
    string s;
    in>>s;
    x=s.c_str();
    return in;
}
ostream& operator << (ostream& out, const bign& x)
{
    out<<x.str();
    return out;
}
int main()
{
	bign a,b;
	cin>>a>>b;
	cout<<a*b<<endl;; 
    return 0;
}
posted @ 2020-07-28 20:20  zhnzh  阅读(81)  评论(0编辑  收藏  举报