码迷,mamicode.com
首页 > 其他好文 > 详细

『模板 高精度计算』

时间:2019-03-13 21:48:10      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:print   this   turn   inline   oid   span   als   简单   ase   

<更新提示>

<第一次更新>


<正文>

高精度计算

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


<后记>

『模板 高精度计算』

标签:print   this   turn   inline   oid   span   als   简单   ase   

原文地址:https://www.cnblogs.com/Parsnip/p/10526364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!