『模板 高精度计算』


高精度计算

在计数类题目或者有些最优解题目中,需要输出的答案很可能会爆\(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;
    }
};


转载于:https://www.cnblogs.com/Parsnip/p/10526364.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值