【算法通关指南:算法基础篇】高精度专题:一篇破除超数运算问题

【算法通关指南:算法基础篇】高精度专题:一篇破除超数运算问题
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南》
永远相信美好的事情即将发生
在这里插入图片描述


文章目录


前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力
ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长

一、高精度

当数据的值特别大,各种类型都存不下的时候,此时就要用高精度算法来计算加减乘除
高精度算法本质上还是模拟算法,用代码模拟小学列竖式计算加减乘除的过程

二、高精度加法

2.1【模板】加法

2.1.1题目

链接:A+B Problem(高精)

在这里插入图片描述

2.1.2 算法原理

模拟小学「列竖式」计算「两数相加」的过程

在这里插入图片描述


核心步骤
(1)先用字符串读入这个数,然后用数组逆序存储该数的每⼀位;
(2)利用数组,模拟加减乘除运算的过程

2.2.3代码

#include<iostream> using namespace std;constint N =1e6+10;int a[N], b[N], c[N];int la, lb, lc;voidadd(int a[],int b[],int c[]){for(int i =0; i < lc; i++){ c[i]+= a[i]+ b[i];// 对应位相加,再加上进位  c[i +1]+= c[i]/10;// 处理进位 c[i]%=10;//处理余数if(c[lc]) lc++;}}intmain(){ string x, y; cin >> x >> y; la = x.size(); lb = y.size(); lc =max(la, lb);for(int i =0; i < la; i++) a[la - i -1]= x[i]-'0';for(int i =0; i < lb; i++) b[lb - i -1]= y[i]-'0';add(a, b, c);for(int i = lc -1; i >=0; i--) cout << c[i];return0;}

三、高精度减法

3.1【模板】减法

3.1.1题目

链接:高精度减法

在这里插入图片描述

3.1.2 算法原理

模拟小学「列竖式」计算「两数相减」的过程

在这里插入图片描述


核心步骤
(1)用字符串读入数据;
(2)判断两个数的大小,让较大的数在前。注意字典序vs数的大小:
a. 位数相等:按字典序比较;
b. 位数不等:按照字符串的长度比较。
(3)将字符串的每⼀位拆分,逆序放在数组中;
(4)模拟列竖式计算的过程:
a. 对应位求差;
b. 处理借位;
(5) 处理前导零。

3.2.3代码

#include<iostream> using namespace std;constint N =1e6+10;int a[N], b[N], c[N]; string x, y;int la,lb,lc; bool cmp(string& x, string& y){//先比较长度if(x.size()!= y.size())return x.size()< y.size();//按字典序比较return x < y;}voidsub(int c[],int a[],int b[]){for(int i =0; i < lc; i++){ c[i]+= a[i]- b[i];if(c[i]<0){ c[i +1]-=1;//向高位借位 c[i]+=10;}}while(lc >1&& c[lc -1]==0) lc--;}intmain(){ cin >> x >> y;//处理负数问题if(cmp(x, y)){swap(x, y); cout <<'-';} la = x.size(); lb = y.size(); lc =max(la, lb);for(int i =0; i < la; i++) a[la - i -1]= x[i]-'0';for(int i =0; i < lb; i++) b[lb - i -1]= y[i]-'0';sub(c, a, b);// c = a - bfor(int i = lc -1; i >=0; i--) cout << c[i];return0;}

四、高精度乘法

4.1【模板】乘法

4.1.1题目

链接:A*B Problem

4.1.2 算法原理

无进位相乘再相加:
• 还是「列竖式」,但是每⼀位相乘的时候不考虑进位,直接把乘的结果放在对应位上;
• 等到所有对应位置「乘完」并且「累加完」之后,「统⼀处理进位」

在这里插入图片描述

核心步骤
(1)用字符串读⼊数据;
(2)将字符串的每⼀位拆分,逆序放在数组中;
(3)模拟无进位相乘再相加的过程:
a. 对应位求乘积;
b. 乘完之后处理进位;
c. 处理余数;
4. 处理前导零。

4.2.3代码

#include<iostream> using namespace std;constint N =1e5+10;int a[N], b[N], c[N]; string x, y;int la, lb, lc;voidmul(int c[],int a[],int b[]){// ⽆进位相乘,然后相加for(int i =0; i < la; i++){for(int j =0; j < lb; j++) c[i + j]+= a[i]* b[j];}//处理进位for(int i =0; i < lc; i++){ c[i +1]+= c[i]/10; c[i]%=10;}// 处理前导零 while(lc >1&& c[lc -1]==0) lc--;}intmain(){ cin >> x >> y; la = x.size(); lb = y.size(); lc = la + lb;for(int i =0; i < la; i++) a[la - i -1]= x[i]-'0';for(int i =0; i < lb; i++) b[lb - i -1]= y[i]-'0';mul(c, a, b);//c = a * b;for(int i = lc -1; i >=0; i--) cout << c[i];return0;}

五、高精度除法

5.1【模板】除法

5.1.1题目

链接:A/B Problem

在这里插入图片描述

5.1.2 算法原理

模拟小学「列竖式」计算「两数相除」的过程(注意,我们这里是「高精度 ÷ 低精度」)。

在这里插入图片描述

核心步骤
定义⼀个指针i 从「高位」遍历被除数,⼀个变量t 标记当前「被除的数」,记除数是b ;
• 更新⼀个当前被除的数t = t × 10 + a[i] ;
• t/b 表⽰这⼀位的商,t%b 这⼀位的余数;
• ⽤t 记录这⼀次的余数,遍历到下⼀位的时候重复上⾯的过程
被除数遍历完毕之后,t ⾥⾯存的就是余数,但是商可能存在前导0 ,注意清空

5.2.3代码

#include<iostream> using namespace std;constint N =1e6+10;typedeflonglong LL;int a[N], b, c[N]; string x;int la;voidsub(int c[],int a[],int b){ LL t =0;for(int i = la -1; i >=0; i--){//当前被除数 t = t *10+ a[i]; c[i]= t / b; t %= b;}//处理前导零while(la >1&& c[la -1]==0) la--;}intmain(){ cin >> x >> b; la = x.size();for(int i =0; i < la; i++) a[la - i -1]= x[i]-'0';sub(c, a, b);//c = a / b;for(int i = la -1; i >=0; i--) cout << c[i];return0;}

总结与每日励志

本文介绍了高精度算法的原理和实现,包括高精度加法、减法、乘法和除法的模板代码。高精度算法通过字符串读入大数,逆序存储在数组中,模拟小学列竖式计算过程,解决常规数据类型无法存储超大数值的问题。加法、减法和乘法部分详细讲解了算法步骤和代码实现,除法部分则针对高精度除以低精度的情况进行说明。所有算法都包含处理进位、借位和前导零的关键步骤,并附有完整代码示例,帮助读者掌握高精度计算的实现方法。

在这里插入图片描述

Read more

【C++动态库】动态库隐式与显式加载 | 为什么要动态加载动态库 | LoadLibrary加载失败 | 参考开源操作系统ReactOS源码 | 用LoadLibraryEx替代LoadLibrary

【C++动态库】动态库隐式与显式加载 | 为什么要动态加载动态库 | LoadLibrary加载失败 | 参考开源操作系统ReactOS源码 | 用LoadLibraryEx替代LoadLibrary

目录 1、概述 2、dll动态库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、为什么要使用动态加载dll动态库的方式?什么时候需要使用动态加载? 3.1、调用系统dll库中未公开的接口 3.2、调用控件库中的注册接口向系统中注册该控件 3.3、底层的业务模块做成动态启动方式,上层产品可以根据自己的业务需要选择想启动的业务模块 4、LoadLibrary动态加载dll动态库失败的场景 4.1、自制的安装包程序中遇到的LoadLibrary加载dll库失败问题 4.2、主程序底层模块调用LoadLibrary加载dll库失败问题 5、 LoadLibaray加载失败的可能原因 6、参考开源操作系统ReactOS中的regsvr32.exe程序的实现源码,找到了解决LoadLibrary加载dll库失败的办法 6.1、ReactOS开源操作系统简介 6.2、使用Source Insight打开ReactOS源码,找到regsvr32.exe程序的代码 7、到微软MSDN上查看LOAD_WITH_

By Ne0inhk

C++ 排序函数sort()

一、sort () 函数是什么 在 C++ 的标准库中,sort()函数是一个强大且常用的工具,定义于<algorithm>头文件中 ,它就像是一个高效的 “排序大师”,专门负责对容器(如vector、array等)或普通数组中的元素进行排序。无论是处理简单的整数数组,还是复杂的自定义结构体,sort()函数都能轻松应对,将杂乱无章的数据按照我们期望的顺序排列得井然有序,为后续的数据处理和分析工作提供了极大的便利,接下来我们就深入了解一下它的具体使用方法。 二、sort () 函数基本语法 2.1 函数原型 sort()函数有两种常见的原型,能够适应不同的排序需求。第一种原型如下: template<class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last); 在这个原型中,first和last都是随机访问迭代器,first指向要排序范围的起始位置,

By Ne0inhk
个人整理的超全C++ 八股文(全是干货)

个人整理的超全C++ 八股文(全是干货)

目录 C++ 面向对象和面向过程 面向过程 面向对象 三大特性? C语言和C++的区别? C++编译过程 多态 是什么? 分类? 虚函数 是什么? 底层? 解决的问题? 构造函数不能设置为虚函数? 重载 重写 隐藏 引用 是什么? 好处 为什么不能初始化为空? 引用与指针的区别? 内存分区 堆和栈的区别? 指针常量和常量指针 NULL在C语言中是(void *)0在C++中是0? C++用nullptr代指空指针? 构造函数 是什么? 拷贝构造 调用时机 拷贝构造参数不是引用行吗? 深浅拷贝的区别? 析构函数 是什么? 内存分配和销毁用什么? new和malloc 区别? new delete malloc free?

By Ne0inhk
【C++】第二十一节—一文详解 | 红黑树实现(规则+效率+结构+插入+查找+验证)

【C++】第二十一节—一文详解 | 红黑树实现(规则+效率+结构+插入+查找+验证)

Hi,我是云边有个稻草人......who?me,be like——→ 《C++》本篇文章所属专栏—持续更新中—欢迎订阅 目录 一、红黑树的概念 1.1 红黑树的规则 1.2 思考⼀下,红黑树如何确保最长路径不超过最短路径的2倍的? 1.3 红黑树的效率 二、红黑树的实现 2.1 红黑树的结构 2.2 红⿊树的插⼊ 【红⿊树树插⼊⼀个值的⼤概过程】 【情况1:变⾊】 【情况2:单旋+变⾊】 【情况2:双旋+变⾊】 2.3 红黑树的插入代码实现 2.4

By Ne0inhk