『模板 高精度计算』


高精度计算

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

时间: 2024-10-13 11:17:58

『模板 高精度计算』的相关文章

Github 恶搞教程(一起『玩坏』自己的 Github 吧)

最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发现原来有人已经做出『玩坏』Github 的工具啦,名叫 gitfiti.主要对应预先定义的模板,进行相应日期的 commit 操作,push 至 Github 后在贡献栏中生成相应像素点,并且利用 Github 贡献数不同颜色深度不同的机制,就可以在自己的贡献栏里面看见像素画了.怎么样,是不是心动啦,那么下面

『昼颜』读后感

『昼颜』读后感       <--故事梗概-->---------------------------------------------------------------------------------------------------   纱和和北野居然恋爱了,仔细想想, 一个是超市的收银员,一个是高中老师,都有充足的时间, 但是,他们都有自己的家庭.   基于自己的最优选择,还是宽容, 后来各自的家庭必须要拆散他们,所以也就用不再见了, 最后,纱和开始了自己独立的生活...  

[TYVJ1827]『Citric II』一道防AK好题

时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 第二届『Citric杯』NOIP提高组模拟赛第一题 描述 Lemon认为在第一届『Citric』杯模拟赛中出的题目太简单了,于是他决定,这次要给参赛选手们一个下马威! ^_^ Lemon手上有一个长度为n的数列,第i个数为xi.他现在想知道,对于给定的a,b,c,他要找到一个i,使得a*(i+1)*xi^2+(b+1)*i*xi+(c+i)=0成立.如果有多个i满足,Lemon想要最小的那个i.Lemon有

『安全工具』注入神器SQLMAP

原文:『安全工具』注入神器SQLMAP Pic by Baidu 0x 00 前言 正是SQLMAP这种神器的存在,SQL注入简直Easy到根本停不下来.... PS:国内类似软件也有阿D,明小子,挖掘机,当你用过他们之后你才会发现SQLMap才是绝对的注入神器 0x 01 注入原理 *****************************************开始分割线***************************************** 时间原因,这段内容就先不写了 就是因为

Linux基本功杂记——[020]——『Linux Capability』

『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations distinguish two categories of processes: privileged processes (whose effective user ID is 0, referred to as superuser or root), and unprivileged proc

零元学Expression Blend 4 - Chapter 35 讨厌!!我不想一直重复设定!!『Template Binding』使用前後的差异

原文:零元学Expression Blend 4 - Chapter 35 讨厌!!我不想一直重复设定!!『Template Binding』使用前後的差异 因为先前写到自制Button时需特别注意Template Binding步骤的部分,有不少网友常常问我差异到底在哪? 所以在这边就特别为了Template Binding做单独的介绍 ? 因为先前写到自制Button时需特别注意Template Binding步骤的部分,有不少网友常常问我差异到底在哪? 所以在这边就特别为了Template

2017-2018-2 165X 『Java程序设计』课程每周成绩公布(0329更新)

2017-2018-2 165X 『Java程序设计』课程 每周成绩公布(0329更新) 本博客将跟随教学进度不定期更新,每次更新后将在课程群公布.如对成绩有疑问,请于公布成绩后的1天之内联系助教,进行审核确认. --------CONTENTS-------- 课下测试 Linux命令基础测试 第一周测试(CH01) 课堂实践 加扣分 Java实验 『总成绩』 第一周 第二周 课下测试 Linux命令基础测试 学号 测试成绩 规格化成绩 Blog 总分 20145209 0 0 0 20155

20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: 需求分析 功能要求 1.自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目,类似于: 1级题目:2 + 5 =: 10 - 5 = 之类的两个数,一个运算符的题目 2.题目运算(判题) 可独立使用 实现中缀表达式转为后缀表达式并计算 判断用户答题正误,并输出正确结果 3.支持真分数 可独立使用 实现分数算式的

2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算

2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 组内成员 20172327 马瑞蕃 20172320 李闻洲 20172317 蒋子行 需求分析 自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目 不同等级的题目应该指的是不同难度的题目,意味着题目的复杂程度随着等级的上升而上升 题目运算(判题) 可独立使用 实现中缀表达式转为后缀表达式并计算 自动生成的题目要先转为后缀表达式,并计算这个后缀表达式 判断用户答题正误,并输出正