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

    struct Bignum
    {
    	typedef long long ll;
        static const int BASE=100000000;
        static const int WIDTH=8;
        static const int maxn=5000+10;
        ll num[maxn];
        int len;
        
        Bignum() {len=1,num[1]=0;}
        Bignum(ll x)
        {
            len=0;
            do
            {
                num[++len]=x%BASE;
                x/=BASE;
            }while(x);
        }
    	static int max(int x,int y) {return x>y?x:y;}
        void read()
        {
            char t[maxn];
            scanf("%s",t+1);
    		int l=strlen(t+1);
            len=(l-1)/WIDTH+1;
            for (int i=1;i<=len;i++)
            {
                int end=l-(i-1)*WIDTH,start=max(1, end-WIDTH+1);
                num[i]=0;
                for (int j=start;j<=end;j++)
                	num[i]=num[i]*10+t[j]-'0';
            }
        }
        void deleteZero()
        {
            while(len>1&&!num[len])
                len--;
        }
        ll& operator [] (int i) {return num[i];}
        Bignum friend operator + (Bignum a,Bignum b)
        {
            Bignum res;
            res.len=max(a.len, b.len);
            for (int i=1;i<=res.len;i++)
                res[i]=0;
            for (int i=1;i<=a.len;i++)
                res[i]+=a[i];
            for (int i=1;i<=b.len;i++)
                res[i]+=b[i];
            for (int i=1;i<res.len;i++)
                if (res[i]>=BASE)
                    res[i+1]++,res[i]-=BASE;
            if (res[res.len]>=BASE)
            {
                res[res.len+1]=1;
                res[res.len]-=BASE; 
                res.len++;
            } 
            return res;
        }
        Bignum friend operator - (Bignum a,Bignum b)
        {
        	Bignum res;
        	res.len=max(a.len, b.len);
        	for (int i=1;i<=res.len;i++)
                res[i]=0;
            for (int i=1;i<=a.len;i++)
                res[i]+=a[i];
            for (int i=1;i<=b.len;i++)
            {
    			res[i]-=b[i];
    			if (res[i]<0)
    				res[i]+=BASE,res[i+1]--;
    		}
    		res.deleteZero();
    		return res;
        }
        Bignum friend operator * (Bignum a,Bignum b)
        {
            Bignum res;
            res.len=a.len+b.len;
            for (int i=1;i<=res.len;i++)
                res[i]=0;
            for (int i=1;i<=a.len;i++)
                for (int j=1;j<=b.len;j++)
                {
                	res[i+j-1]+=a[i]*b[j];
                    if (res[i+j-1]>=BASE)
                        res[i+j]+=res[i+j-1]/BASE,res[i+j-1]%=BASE;
                }
            if (res[res.len]>=BASE)
            {
                res[res.len+1]=res[res.len]/BASE;
                res[res.len]%=BASE; 
                res.len++;
            }
            res.deleteZero();
            return res;
        }
        Bignum friend operator / (Bignum a,const ll b)
        {
        	Bignum res=Bignum(0),base=Bignum(BASE);
        	ll last=0;
        	for (int i=a.len;i>=1;i--)
        	{
    			last=last*BASE+a[i];
        		res=res*base+Bignum(last/b);
        		last%=b;
        	}
        	return res;
        }
    	Bignum friend operator % (Bignum a,const ll b) {return a-a/b*b;}
    	Bignum operator += (Bignum b) {return *this=*this+b;}
    	Bignum operator -= (Bignum b) {return *this=*this-b;}
    	Bignum operator *= (Bignum b) {return *this=*this*b;}
    	Bignum operator /= (const ll b) {return *this=*this/b;}
        void print()
        {
            printf("%lld",num[len]);
            for (int i=len-1;i>=1;i--)
                printf("%08lld",num[i]);
        }
    };
    
  • 相关阅读:
    TensorboardX的使用【有手就⭐系列】
    Python学习记录
    es 之 自定义 mapping(五)
    es 索引和文档 API (四)
    布尔查询(三)
    term 和 match 查询(二)
    使用 Python 批量将数据插入到 ES中
    【flask + vue 前后端分离博客】设计 User 用户(三)
    【flask + vue 前后端分离博客】使用 axios 访问接口(二)
    【flask + vue 前后端分离博客】创建第一个 Flask RESTFul(一)
  • 原文地址:https://www.cnblogs.com/hkr04/p/high-precision.html
Copyright © 2011-2022 走看看