基础算法(四)——高精度

算法详解——高精度算法 算法详解 阅读详情

高精度

介绍

高精度算法是用于处理大整数运算的,大整数的大小一般是,其位数len(x) <= 1e6,标准数据即x <= 1e9

一般来说考四种情况(大写字母代表大数据,小写字母代表标准范围数据):

  • 大整数相加 A+B
  • 大整数相减 A-B
  • 大整数乘小整数 A*a
  • 大整数除小整数 A/a

具体做法是:将大整数的每一位存放到数组里去,C++里一般先用字符串string将数据读入,然后将每一位存放到整形数组中。这里我们从数据的低位先进行存放,即假设数据x=123456789,那么数组a[0] = 9,方便后续进位操作,这样最后只需要在数组末端直接加一个数。然后结合进位和借位进行逐位运算。

高精度的思想很简单,但是代码需要好好理解一下,最好直接背

核心思想:

这里分四个情况讨论(以下大整数A的第i位都用A[i]表示):

  • 高精度加法:

    image-20230330160441747

  • 高精度减法:

    image-20230330160446661

  • 高精度乘法:

    image-20230330160450799

  • 高精度除法:

    待整理

模板代码:

高精度加法:

// C = A + B
vector<int> add(vector<int> A, vector<int> B) // 返回A+B的值 
{
	int t = 0;
    vector<int> C;
    for(int i=0; i<A.size()||i<B.size(); i++)
    {
		if(i < A.size()) t+=A[i];
        if(i < B.size()) t+=B[i];
        C.push_back(t%10);
        t/=10;
    }
    
    if(t) C.push_back(t);
    
    return C;
}

// auto C = add(A, B);

高精度减法:

// 判断A是否大于B
bool cmp(vector<int> A, vector<int> B)
{
	if(A.size() != B.size()) return A.size() > B.size();
    for(int i=A.size() - 1; i>=0 ; i++)
		if(A[i] != B[i])
            return A[i] > B[i];
        return true;
}

// C = A - B
vector<int> sub(vector<int> A, vector<int> B) // 返回A+B的值 
{
	 
    vector<int> C;
    for(int i=0,t=0; i<A.size(); i++)
    {
        t = A[i] - t;// t = A[i] - t
        if(i < B.size()) t -= B[i]; // t = A[i] - B[i] - t
        C.push_back((t+10)%10); // 得到借位or不借位的结果
        if(t < 0) t = 1; // 需要借位
        else t = 0 // 不需要借位
    }
    
    while(C.size()>1 && C.back() == 0) C.pop_back();
    
    return C;
}

// 主函数里的函数调用逻辑
int main()
{
	if(cmp(A, B))
    {
        auto C = sub(A, B);
        
        for(int i = C.size() - 1; i >= 0 ; i --) cout << C[i]; // 打印结果
    }
    else
    {
    	auto C = sub(B, A); 
        
        cout << '-'; // 结果是负数,先输出一个负号
        
        for(int i = C.size() - 1; i >= 0 ; i --) cout << C[i]; // 打印结果
    }
}
 

高精度乘法:

vector<int> mul(vector<int> A, int b)
{
    int t = 0;
    vector<int> C;
    for(int i=0; i<A.size() || t; i++)
    {
        if(i < A.size()) t += A[i]*b;
        C.push_back(t%10);
        t /= 10;
    }
    
    while(C.size()>1 && C.back()==0) C.pop_back();
    return C;
}

例题1:

image-20230330160520870

代码:
#include<iostream>
#include<vector>
using namespace std;

vector<int> A, B;
vector<int> add(vector<int> A, vector<int> B)
{
    vector<int> C;
    int t = 0;
    for(int i=0; i<A.size()||i<B.size(); i++)
    {
        if(i < A.size()) t += A[i];
        if(i < B.size()) t += B[i];
        C.push_back(t%10);
        t /= 10;
    }
    if(t) C.push_back(t);
    return C;
}

int main()
{
    string a, b;
    cin >> a >> b;
    for(int i=a.size()-1; i>=0; i--) A.push_back(a[i] - '0');
    for(int i=b.size()-1; i>=0; i--) B.push_back(b[i] - '0');
    
    auto C = add(A, B);

    for(int i=C.size()-1; i>=0; i--) printf("%d", C[i]);
}

例题2:

image-20230330160529692

代码:
#include<iostream>
#include<vector>
using namespace std;

vector<int> A, B;

// A >= B
bool cmp(vector<int> &A, vector<int> &B)
{
    if(A.size() != B.size()) return A.size()>B.size();
    for(int i=A.size()-1; i>=0; i--)
    {
        if(A[i]!=B[i]) return A[i] > B[i];
    }
    return true;
}

vector<int> sub(vector<int> &A, vector<int> &B)
{
    int t = 0;
    vector<int> C;
    for(int i=0; i<A.size(); i++)
    {
        t = A[i] - t;
        if(i < B.size()) t -= B[i];
        C.push_back((t+10)%10);
        if(t<0) t = 1;
        else t = 0;
    }
    
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;    
}

int main()
{
    string a, b;
    cin >> a >> b;
        
    for(int i=a.size()-1; i>=0; i--) A.push_back(a[i]-'0');
    for(int i=b.size()-1; i>=0; i--) B.push_back(b[i]-'0');

    if(cmp(A, B))
    {
        auto C = sub(A, B);
        for(int i=C.size()-1; i>=0; i--) printf("%d", C[i]);
    }
    else
    {
        auto C = sub(B, A);
        printf("-");
        for(int i=C.size()-1; i>=0; i--) printf("%d", C[i]);
    }
}

例题3:

image-20230330160538486

代码
#include<iostream>
#include<vector>
using namespace std;

vector<int> mul(vector<int> A, int b)
{
    int t = 0;
    vector<int> C;
    for(int i=0; i<A.size() || t; i++)
    {
        if(i<A.size()) t += A[i]*b;
        C.push_back(t%10);
        t /= 10;
    }
    
    while(C.size()>1 && C.back()==0) C.pop_back();
    
    return C;
}

int main()
{
    string a;
    int b;
    
    cin >> a >> b;
    
    vector<int> A;
    for(int i=a.size()-1; i >= 0; i--) A.push_back(a[i] - '0');
    
    auto C = mul(A, b);
    
    for(int i=C.size()-1; i >= 0; i--) printf("%d", C[i]);
    
    return 0;
}

例题4:

image-20230330160551914

代码

待整理

算法笔记(四):高精度 (3)高精度算法 目录 1、高精度算法 高精度算法介绍 高精度与竖式计算 进位和前导零 2、高精度数的加减乘除 高精度加法 高精度减法 高精度乘法 高精度除法 写在最后!!! 1、高精度算法 高精度算法介绍 高精度算法(High Accuracy Algorithm)是处理大数字的一种数学计算方法,是用计算机对于超大数字的一种模拟加减乘除等的运算。但是计算机无法正常存储非常庞大的数字,便把数字进行拆分存储到一个数组找那个,用一个数组去表示一个数字,这样的数字便是高精度数。简言. 阅读详情

相关推荐

【算法之路】高精度算法(实现加减乘除)

介绍高精度算法中的加减乘除实现:附AC代码和思路

m0_74044018的博客 3267

高精度算法详解(加减乘除+高精度案例)

高精度通常指的是在计算机中对超过基本数据类型表示范围的大整数或者小数进行精确计算的能力。在计算机中,通常使用固定长度的数据类型(比如int、long、float、double等)来表示数字,这些数据类型的表示范围是有限的,就无法被准确表示和计算,这就需要使用高精度计算。精度计算经常用于需要对非常大或者非常精确的数字进行计算的场景,比如在密码学中的大素数运算、金融领域的精确计算、科学计算中的精确浮点数运算等。为了实现高精度计算,通常需要设计特定的数据结构和算法来表示和计算这些超出固定数据类型范围的数字.

2301_80708596的博客 7906

C语言高精度算法(加、减、乘、阶乘、高除以高,高除以低)

高精度算法

qq_65265649的博客 7585

[基础算法(四) 高精度加减乘除运算]

高精度加减乘除

2301_80343771的博客 603

高精度算法详解

高精度加减乘除

qq_66314292的博客 2783

高精度算法——高精度减法

高精度减法也同加法一样,也是用于位数太大的运算,给你一个十几位的数你可能会做直接开个long long 的数据类型就解决了,但是给你一个100位的呢,1000位的呢,开long long 也不够了,所以就要用高精度了,也就是高精度算法就是处理位数很大数据。 如果你对高精度加法也不是很熟悉你可以看这个(高精度算法——高精度加法)...

m0_62999279的博客 6874

算法基础课

acwing算法基础课 文章目录acwing算法基础课(一) 基础算法快速排序快速选择归并排序逆序对数量二分法数的范围数的三次方根四平方和分巧克力高精度高精度加法高精度减法前缀和一维前缀和二维前缀和差分(前缀和逆运算)一维差分二维差分双指针算法最长连续不重复子序列数组元素的目标和判断子序列离散化——区间和区间合并(二)数据结构KMP并查集合并集合连通块中点的数量堆排序单链表哈希表字符串哈希(三)搜索与图论dfs排列数字n皇后(dfs+剪枝)bfs走迷宫八数码数和图的广搜图中点的层次拓扑排序(四)数学知识质数

m0_67458912的博客 589

【有营养的算法笔记】基础算法 —— 高精度算法(加减乘除)

四则高精度算法(加减乘除)的思路及模板、算法实现

StackFrame 2341

【基础】(C语言)高精度算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言:为什么我们需要高精度算法?一、高精度算法基础二、高精度乘法1.计算流程2.完整代码三、总结 前言:为什么我们需要高精度算法? 多数时候我们需要进行非常庞大的数字运算,其中涉及四则运算,加减乘除,但是当连最大的long long类型也容纳不下如此大的数字的时候,我们应该怎么办? 那么,我们就要用到今天所介绍的高精度算法,顾名思义,我们可以用一些特殊的方式来得出我们想要计算的答案。 一、高精度算法基础 在讲高精度算法之前,我们需

MaxwellWong 1万+

STM32实战指南:TFTLCD液晶屏驱动与ILI9341应用解析

本文详细解析了STM32驱动TFTLCD液晶屏的实战技巧,重点介绍了ILI9341控制器的硬件连接、寄存器操作及性能优化方法。通过8080并行接口时序分析、GRAM操作优化和DMA传输应用,帮助开发者高效实现液晶屏驱动,适用于工业控制、智能家居等场景。

weixin_26873711的博客 232

思科模拟器CIsco Packet Tracer利用三层交换机实现VLAN间路由

版权声明:如果对大家有帮助,大家可以自行转载的。 1.技术原理: 三层交换机具备网络层的功能,实现 VLAN 相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的 IP 地址,查找路由表进行选路转发,三层交换机利用直连路由可以实现不同 VLAN 之间的相互访问。三层交换机给接口配置 IP 地址。采用 SVI(交换虚拟接口)的方式实现 VLAN 间互连。SVI 是指为交换机中的VLAN 创建...

qq_37992321的博客 1万+

【基础算法】高精度算法

高精度算法 高精度加法 模板: 模板题+详解 高精度减法 模板: 模板题+详解 高精度乘法 模板 模板题+详解 高精度除法 模板 模板题+详解

2402_85428625的博客 1813

11-4 AEB 算法原理及系统组成

本专题旨在探讨如何利用仿真软件开发自动紧急制动系统AEB,主要通过整理开发流程,实现从需求到验证的全流程掌握,为后续开发提供支持;同时,研究了如何在汽车自动驾驶仿真工具中开发自己的算法,并解决了从ISO、E-CNAP、GB/T以及交通法规等提炼出功能需求的问题,以快速实现原型模型的开发。本专题重点讲解了AEB的工作原理、系统/软件架构和需求、算法模型及实现、CCRs/CCRb/CCRm建模与仿真、VRU-AEB-B/P/M建模与仿真,同时还提供了测试用例,期待将AEB算法成功地产品化。

AIgraphX 8547

基础算法 第一课——高精度算法详解

高精度算法,是一种处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几百亿的大数字。 一般的,这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘等运算。 对于非常庞大的数字无法在计算机中正常存储。于是,将这个数字拆开成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。

阿巴阿巴 1705

Linux系统安装部署Redis完整教程(图文详解)

最近需要在Linux服务器安装部署Redis,参考了网上很多的文章,比较零碎,所以我自己写了一篇完整的Redis安装部署文档,在部署Redis之前重装了我的华为服务器,就是为了给大家一步步阐述我的操作过程,配合图文进行讲解更加通俗易懂!

黄团团的个人博客 6690

QGC4.0.11界面修改

QGC4.0.11。

超维空间科技的博客 2464

c++高精度算法

c++语言 这是我的第一篇高精度文章。 什么是高精度 有时,我们要做特别大数据的计算。多大呢?几百万位,远远超过了long long的数据范围,直接用long long肯定会溢出。这时候我们就要用高精度算法 PS:python自带高精度 所有高精度算法的基本原理 大体的思路,就是用字符数组(因为字符数组可以达到一个下标对应一个数字,达到按位处理的目的),然后转到整形数组(整型数组才能进行计算)一个下标对应一个数字,用另一个数组进行按位相加。 高精度运算 现在只写高精度加法。以后会逐渐补充 加法 思路分析 我

欢迎来到jahn2007的博客 6641

基于 STM32 与压电薄膜的婴儿睡眠呼吸暂停监测床垫设计

本设计以 STM32F103C8T6 为主控,结合 PVDF 压电薄膜传感器,通过模拟信号调理与数字峰值检测算法,实现了对婴儿睡眠呼吸状态的实时监测。系统结构简单、成本低廉、无接触无束缚,当检测到 20 秒以上无呼吸信号时自动触发声光报警,可有效降低婴儿睡眠呼吸暂停带来的安全风险。后续可扩展蓝牙 / WiFi 模块,将报警信息推送至家长手机端,实现远程监护。

weixin_42300449的博客 148

【算法基础】高精度减法

【算法基础】高精度算法

Weraphael的博客 2372

基于ESP32的智能厨房控制系统开发

随着智能家居技术的发展,越来越多的家庭开始将传统的厨房设备进行智能化改造,以提高烹饪效率和生活质量。智能厨房控制系统是物联网(IoT)应用的重要组成部分,它将家居设备、传感器和网络结合起来,提供便捷的控制与监测功能,使厨房的烹饪过程更加智能、便捷和安全。基于ESP32的智能厨房控制系统不仅能够实现远程控制和监控,还能实现温度、湿度、烹饪状态的实时反馈,甚至具备智能化的推荐和自动化控制能力。ESP32是一款功能强大、集成度高的嵌入式开发平台,具有Wi-Fi和蓝牙双模通信能力,广泛应用于物联网设备的开发。

2201_76125393的博客 657

yolov26改进 | 融合改进篇 | 基于 MobileNetV4 和双向特征金字塔网络BiFPN的融合改进(全网独家首发)

本文介绍BiFPN与MobileNetV4融合改进的YOLOv26。许多模块单独使用能够涨点,但直接叠加后可能因功能重复、通道不匹配、尺度冲突而掉点,因此融合前必须理解各模块作用。MobileNetV4利用UIB与Mobile MQA构建轻量主干,提升特征提取能力;BiFPN通过可学习权重完成双向多尺度融合,强化大、中、小目标的信息交互。两者优化Backbone与Neck,功能互补、结构冲突较少。本文提供代码、配置、消融对比及Codex修改思路,MobileNetV4也可替换其他主干,便于组合实验与二次创新

Snu77的博客 239

高精度算法

高精度通常指的是在计算机中对超过基本数据类型表示范围的大整数或者小数进行精确计算的能力。在计算机中,通常使用固定长度的数据类型(比如int、long、float、double等)来表示数字,这些数据类型的表示范围是有限的,超出这个范围的数字就无法被准确表示和计算,这就需要使用高精度计算。高精度加法的设计思路主要包括以下几个关键步骤:1. 输入处理 - 将输入的两个高精度数以字符串的形式接收。2.将字符串拆解为一个个数字存到int数组中3. 逐位相加 - 从低位(字符串的末尾)开始,逐位将两个数的对应位数字相

关我必回,洛谷名:Carlos_01dao09 1616

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法基础 1 —— 模拟和高精度算法

本文介绍了模拟算法和高精度计算的常见题型及解法。模拟部分包含多项式输出、蛇形矩阵和字符串展开,重点考察分类讨论和代码实现能力。高精度计算部分涵盖加、减、乘、除四种运算,通过字符串读入、数组存储和竖式模拟实现大数运算。其中加法处理进位,减法处理借位,乘法采用无进位相乘后处理进位,除法则通过逐位计算商和余数。所有算法都遵循预处理、核心计算和结果处理三个步骤,体现了将数学运算转化为程序实现的通用思路。

rebirth557的博客 732

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++基础算法①——高精度加减法计算

高精度导论、高精度+低精度、高精度+高精度、高精度减法。

博樽 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: (实时更新)蓝桥杯知识点笔记 | (四)宽搜
下一篇: (实时更新)蓝桥杯知识点笔记 | (五)动态规划之基础DP
introversi0n
博客等级 码龄5年 233粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

introversi0n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值