1. 程式人生 > >『模板 高精度計算』

『模板 高精度計算』

更新 als mes str 模板 -- oid ret char

<更新提示>

<第一次更新>


<正文>

高精度計算

在計數類題目或者有些最優解題目中,需要輸出的答案很可能會爆\(longlong\),這時候就需要用到高精度了。高精度計算較為簡單,不再講解,以下給出輔助常用的高精度計算模板:支持正整數的加,減,乘運算,讀入輸出,比較,以\(1e8\)壓位計算,結構體封裝。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
const int base=1e8,Maxlen=1e4;
struct bign
{
    int d[Maxlen],len;
    inline void clear(void)
    {
        len=0;
        memset(d,0,sizeof d);
    }
    inline void print(void)
    {
        printf("%d",d[len]);
        for(int i=len-1;i>=1;i--)
            printf("%08d",d[i]);
    }
    inline bign read(void)
    {
        clear();
        char s[5000];
        scanf("%s",s);
        int last=strlen(s)-1,temp;
        while(last>=7)
        {
            temp=0;
            for(int i=last-8+1;i<=last;i++)
                temp=temp*10+s[i]-'0';
            d[++len]=temp;
            last-=8;
        }
        temp=0;
        for(int i=0;i<=last;i++)
            temp=temp*10+s[i]-'0';
        d[++len]=temp;
        while(!d[len]&&len>1)len--;
        return *this;
    }
    bign operator = (int a)
    {
        clear();
        do
        {
            d[++len]=a%base;
            a/=base;
        }
        while(a);
        return *this;
    }
    bign operator * (bign a)
    {
        bign res;
        res.clear();
        long long temp;
        for(int i=1;i<=len;i++)
        {
            temp=0;
            for(int j=1;j<=a.len;j++)
            {
                temp+=1LL*d[i]*a.d[j]+res.d[i+j-1];
                res.d[i+j-1]=temp%base;
                temp/=base;
            }
            if(temp)
                res.d[i+a.len]=temp;
        }
        res.len=len+a.len;
        while(!res.d[res.len]&&res.len>1)res.len--;
        return res;
    }
    bign operator + (bign a)
    {
        for(int i=1;i<=max(a.len,len);i++)
        {
            d[i]+=a.d[i];
            d[i+1]+=d[i]/base;
            d[i]%=base;
        }
        len=max(a.len,len)+5;
        while(!d[len]&&len>1)len--;
        return *this;
    } 
    bign operator - (bign a)
    {
        for(int i=1;i<=len;i++)
        {
            d[i]-=a.d[i];
            if(d[i]<0)d[i+1]--,d[i]+=base;
        }
        while(!d[len]&&len>1)len--;
        return *this;
    } 
    bool operator < (const bign a)const
    {
        if(a.len^len)
            return len<a.len;
        for(int i=len;i>=1;i--)
            if(d[i]^a.d[i])
                return d[i]<a.d[i];
        return false;
    }
};


<後記>

『模板 高精度計算』