【模板】压位高精度

高精度模板 高精度模板,整合了多篇文档,有高精度加法,高精度减法,高精度乘法,高精度除法,高精度取模法等模板... 立即下载

任何沾染了高精度的题都是恶心的题……
看到高精度的题就烦呐TAT
干脆存一个高精度的模板好了

#include <cstdio>  
#include <cstring>  
#include <algorithm>  


using namespace std;  


const int power = 1;      //每次运算的位数为10的power次方,在这里定义为了方便程序实现  
const int base = 10;      //10的power次方。  


//要压位的时候,只需改power 和 base即可,如压万位高精,那么power = 4, base = 10000  


const int MAXL = 1001;    //数组的长度。  


char a[MAXL], b[MAXL];  
struct num  
{  
    int a[MAXL];  
    num() { memset(a, 0, sizeof(a)); }                      //初始化  
    num(char *s)                                            //将一个字符串初始化为高精度数  
    {  
        memset(a, 0, sizeof(a));  
        int len = strlen(s);  
        a[0] = (len+power-1) / power;                       //数的长度  
        for (int i=0, t=0, w; i < len ;w *= 10, ++i)          
        {  
            if (i % power == 0) { w = 1, ++t; }  
            a[t] += w * (s[i]-'0');  
        }  
        //初始化数组,这里自己模拟一下,应该很容易懂的~  
    }  
    void add(int k) { if (k || a[0]) a[ ++a[0] ] = k; }     //在末尾添加一个数,除法的时候要用到  
    void re() { reverse(a+1, a+a[0]+1); }                   //把数反过来,除法的时候要用到  
    void print()                                            //打印此高精度数  
    {  
        printf("%d", a[ a[0] ]);        
        //先打印最高位,为了压位 或者 该高精度数为0 考虑  
        for (int i = a[0]-1;i > 0;--i)  
        printf("%0*d", power, a[i]);    
        //这里"%0*d", power的意思是,必须输出power位,不够则前面用0补足  
        printf("\n");  
    }  
} p,q,ans;  


bool operator < (const num &p, const num &q)              //判断小于关系,除法的时候有用  
{  
    if (p.a[0] < q.a[0]) return true;  
    if (p.a[0] > q.a[0]) return false;  
    for (int i = p.a[0];i > 0;--i)  
    {  
        if (p.a[i] != q.a[i]) return p.a[i] < q.a[i];  
    }  
    return false;  
}  


num operator + (const num &p, const num &q)               //加法,不用多说了吧,模拟一遍,很容易懂  
{  
    num c;  
    c.a[0] = max(p.a[0], q.a[0]);  
    for (int i = 1;i <= c.a[0];++i)  
    {  
        c.a[i] += p.a[i] + q.a[i];  
        c.a[i+1] += c.a[i] / base;  
        c.a[i] %= base;  
    }  
    if (c.a[ c.a[0]+1 ]) ++c.a[0];  
    return c;  
}  


num operator - (const num &p, const num &q)               //减法,也不用多说,模拟一遍,很容易懂  
{  
    num c = p;  
    for (int i = 1;i <= c.a[0];++i)  
    {  
        c.a[i] -= q.a[i];  
        if (c.a[i] < 0) { c.a[i] += base; --c.a[i+1]; }  
    }  
    while (c.a[0] > 0 && !c.a[ c.a[0] ]) --c.a[0];            
    //我的习惯是如果该数为0,那么他的长度也是0,方便比较大小和在末尾添加数时的判断。  
    return c;  
}  


num operator * (const num &p, const num &q)                   
//乘法,还是模拟一遍。。其实高精度就是模拟人工四则运算!  
{  
    num c;  
    c.a[0] = p.a[0]+q.a[0]-1;  
    for (int i = 1;i <= p.a[0];++i)  
    for (int j = 1;j <= q.a[0];++j)  
    {  
        c.a[i+j-1] += p.a[i]*q.a[j];  
        c.a[i+j] += c.a[i+j-1] / base;  
        c.a[i+j-1] %= base;  
    }  
    if (c.a[ c.a[0]+1 ]) ++c.a[0];  
    return c;  
}  


num operator / (const num &p, const num &q)               //除法,这里我稍微讲解一下  
{  
    num x, y;  
    for (int i = p.a[0];i >= 1;--i)                       //从最高位开始取数  
    {  
        y.add(p.a[i]);             //把数添到末尾(最低位),这时候是高位在前,低位在后  
        y.re();                    //把数反过来,变为统一的存储方式:低位在前,高位在后  
        while ( !(y < q) )         //大于等于除数的时候,如果小于的话,其实答案上的该位就是初始的“0”  
            y = y - q, ++x.a[i];   //看能减几个除数,减几次,答案上该位就加几次。  
        y.re();                    //将数反过来,为下一次添数做准备  
    }  
    x.a[0] = p.a[0];  
    while (x.a[0] > 0 && !x.a[x.a[0]]) --x.a[0];  
    return x;  
}  


int main()  
{  
    scanf("%s", a);  
    scanf("%s", b);  
    reverse(a, a+strlen(a));  
    reverse(b, b+strlen(b));  

    p = num(a), q = num(b);  

    ans = p + q;  
    ans.print();  

    ans = p - q;  
    ans.print();  

    ans = p * q;  
    ans.print();  

    ans = p / q;  
    ans.print();  
}  

转自http://blog.youkuaiyun.com/devillaw_zhc/article/details/7776578

高精度类(压位)C++实现 高精度压位 #include #include #include using namespace std; const int maxleng=500; class BigInt { private: int leng; int num[maxleng]; public: 立即下载

相关推荐

树莓派4B学习笔记一

树莓派4b烧录Ubuntu20.04&&配置Ubuntu桌面

m0_55202222的博客 3643

【算法专题】高精度之压位

高精度之压位 当数据过大时,此时long long存储不下,因此需要使用vector或者数组存储,然后计算。 一般vector或者数组中每个数据都是一个int,如果每个位置只是存储0~9一位数字的话,比较浪费空间,并且计算也会变慢。因此可以让每个位置存储连续的多位数字,这被称作压位。 这里以压4位为例,也就是说:vector或者数组中每个位置存储四个连续的数字。 1. 基本高精度运算 关于基本高精度计算可以参考:高精度运算 2. 高精度压位运算 压位和不压位的高精度计算存在三点不同点(以下提到的压

weixin_42638946的博客 4581

无人驾驶之车辆控制(1)纯跟踪(Pure Pursuit)算法与Stanley算法

目录引言1 Pure Pursuit纯几何跟踪算法1.1 车辆运动学自行车模型1.2 算法原理1.3 仿真测试2 Stanley算法2.1 算法原理2.2 仿真测试3 总结 引言 本文对Pure Pursuit以及Stanley control两种算法进行了调研以及初步的性能摸底。 1 Pure Pursuit纯几何跟踪算法 1.1 车辆运动学自行车模型 运动学是从几何学的角度研究物体的运动规律,...

zxxxxxxy的博客 2万+

压位高精度

高精度,新的飞跃

Young_20220202的博客 503

网络系统实现技术之IPX与SPX

IPX/SPXNovell NetWare网络Novell公司为适应网络发展,将主机网络转换为PC网络,开发了Novell NetWare网络系统。该系统中基于客户机/服务器模式。以普通PC机做为客户机,以性能强大的服务器做为服务器,为客户机提供文件服务、数据库服务及其他服务。与前面的SNA模型一样,Novell NetWare也早于OSI模型,所以不能与OSI模型严格对应,但也有很明

成片的大树 9164

告别混乱!在Unity中为Best MQTT v3设计清晰的服务层:配置、连接、订阅发布模块拆分指南

本文详细介绍了如何在Unity中使用Best MQTT v3插件构建清晰的服务层架构,包括配置管理、连接服务、订阅管理和发布服务的模块化拆分。通过解耦设计、事件驱动和接口抽象,提升代码可维护性和可测试性,适用于物联网和实时通信开发场景。

weixin_30576827的博客 359

高精度计算(三)压位

压位高精

sSay 1万+

ERPS协议原理

目录 1、ERPS概述: 2、ERPS名词概念解释: 3、ERPS协议报文: 4、ERPS单环基本原理: 5、单环多实例原理: 6、多环原理: 1、ERPS概述: ERPS(Ethernet Ring Protection Switching),即以太网多环保护技术,是ITU-T定义的一种二层破环协议标准,标准号为ITU-T G.8032/Y1344,因此又称为G.8032。它定义了RAPS(Ring Auto Protection Switching)协议报文和保护倒换机制。 ERPS目前支持v1和v2两

weixin_44880796的博客 1万+

进阶 - 【压位】高精度算法

算法学习笔记,进阶版的【高精度算法】--> 【压位】高精度算法

仟墨(郑龙浩)的博客 1241

灵魂三问:因果推断

什么是因果推断?为什么研究因果推断?怎么进行因果推断研究?

ML OR 智能决策的博客 2902

FPGA远程升级避坑指南:用AXI Quad SPI IP读写N25Q128 Flash的完整流程

本文详细介绍了FPGA远程升级过程中使用AXI Quad SPI IP读写N25Q128 Flash的完整流程,包括IP核配置、Flash操作指令集、双镜像备份设计及生产级远程升级协议。通过最佳实践和避坑策略,帮助开发者实现可靠的镜像更新方案,提升系统可靠性和可维护性。

weixin_30542079的博客 675

高精度算法-压位

我们之前做过大整数类的运算的题目 大整数乘法 大整数加法 这个方法看似是无敌的,,, 但是那么如果是一个10000^10000位的数据呢? 数组根本开不到这么大的。。。 有这样的题目吗? 传送门 这时候我们就需要压位了。。。 还记得我们存储数字的方式? 举个栗子:1234 + 1234这是之前的存储方式 实际上我们一个数组空间(int)是可以储存 2147483647 以...

LiuKairui的博客 6920

使用安卓的IMU数据进行 行人航位推算(PDR)推算步长 附python 代码

加速度计数据、陀螺仪数据、重力传感器数据、姿态仰角数据。数据分析与定位轨迹生成主要使用Python离线完成。示意图。

三维点云技术探索 1916

高精度模板(压位版)

(这次没偷懒,加减乘除模开方都有。。) 一直不想写压位,直到。。。。。。。。。。 遇到了一道会卡不压位高精度的题,心痛到无法呼吸 而且是在考试的时候。。。。。。。。。。 于是临时推,发现压位的输入输出真的是恶心 但是压位的优点也是明显的:速度快,内存低 缺点在于,如果让你保留一定位数的话,不到万不得已别写这玩意儿 以及在高精度除以整型时,如果整型过大,是会炸掉的。 关于

qq_37816449的博客 666

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

压位高精度模板

原先是整型数组每个元素存1个数字,压位高精是每位存8个数字,这样可以加速8呗,空间也减小了。可谓是对整形数组的充分利用。 #include #include #include #include #include #include #include #include #include #include #include #include #include #define LL long long

哇哈哈的专栏 2030

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

高精度压位(亿进制)模板

#include<bits/stdc++.h> using namespace std; typedef long long LL; const LL inf=0x3f3f3f3f; class HighPrecision{//高精度压位模板 public: vector<LL>p; bool operator<(HighPrecision b){//重载...

Long_hen的博客 537

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

逝压位的高精度模板

总的来说只是一时兴起,没想到写了这么久()。不过总算是赶完了,全部数压的都是8位,long long,支持负数,高精度整除,取余,以及除了位运算的操作符都有。可惜的一点是没有用vector,数组大小得自己调,但是压的位数也可以调。代码整体还有许多瑕疵,但我不会,也没精力调,希望大家可以多提一点建议。代码就放在这里(也许以后可以讲一下压位高精?长就对了,高精度怎么可能短。

mornstar_的博客 270

高精度乘高精度(模板、压位)

ADV-353 高精度乘法 蓝桥杯算法提高 http://lx.lanqiao.cn/problemset.page?code=ADV-&userid=301004 code #include <cstdio> #include <cstring> using namespace std; const int N = 10005; char str_a[N], str_b[N]; int a[N], b[N], c[N << 1]; int main() {

NaNa 212

高精度模板【重载运算符+压位】

昨天做一道DP的题(矩阵取数游戏),本来是很简单的,但是要用高精度,又不想用__int128水过去(谁让NOIP不让),于是自己打了一个小时,最后成功挂了。。。 于是本蒟蒻痛定思痛,感觉高精度还是重载运算符好用啊,就花了几个小时打了一个自以为比较好记好用高精度模板: 注意暂不支持负数,如果发现有bug欢迎指出。 /*采用重载运算符,压B位 支持高精数赋值与输出、高精加(减)高精、高...

weixin_30788239的博客 301

【原创】高精度(压位储存)模板

无聊写了个高精度模板玩玩...... (以前有些地方写错了TAT) 1 /* 2 唐代李白 3 《江夏别宋之悌》 4 楚水清若空,遥将碧海通。人分千里外,兴在一杯中。 5 谷鸟吟晴日,江猿啸晚风。平生不下泪,于此泣无穷. 6 */ 7 #include <iostream> 8 #include <cstdio&...

Gregory99174的博客 166

压8位高精度模板

#define LL long long int struct bignum { LL num[MAXN] ; void init() { memset(num,0,sizeof num); } bool operator < (const bignum &a)const { if(num[0]!=a.num[0])ret

蒟蒻的奋斗史 829

压位的高精度大数模板

#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<vector&...

weixin_30466039的博客 199

高精度压位模板

#include #include #include #include #include #include #define inf 1000000000] #define p 9 using namespace std; void _scanf(int &x){ char ch=getchar(); bool f=0; x=0; while(!isdigit(ch)) { if(ch==

eliforsharon的博客 466

{模板}高精度压位

乘:procedure c1(x:longint); var i,j,k:longint; y:int64; begin y:=0; for i:=1 to ans[0] do begin ans[i]:=ans[i]*x+y; y:=ans[i] div mo; ans[i]:=ans[i] m

GH的博客 846

压位(4位)高精度模板

【代码】压位(4位)高精度模板。

ericjian2011的博客 525
上一篇: 【Codeforces2015ICL,Finals,Div. 1#J】Ceizenpok's formula(扩展Lucas定理+中国剩余定理)
下一篇: 【洛谷1291】百事世界杯之旅
sdfzchy
博客等级 码龄10年 27粉丝 135原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值