zoukankan      html  css  js  c++  java
  • 高精度通用模板

    #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;
    }
    
  • 相关阅读:
    iOS:抽屉侧滑动画两种形式(1、UIView侧滑 2、ViewController侧滑)
    深入浅出 React Native:使用 JavaScript 构建原生应用
    JQuery:通过noConflict()方法同时使用jQuery 和其他框架
    JQuery AJAX: 了解jQuery AJAX
    iOS:iOS开发非常全的三方库、插件等等
    JavaScript:实现瀑布流
    iOS:crash崩溃日志分析
    敏捷开发一千零一夜
    江恩交易战法
    苹果:贩卖高科技的美学体验
  • 原文地址:https://www.cnblogs.com/zhnzh/p/13393624.html
Copyright © 2011-2022 走看看