本文一部分内容参考了wmy0217_博主
目录
导语
在日常编程中,我们难免会遇到一些庞大的数字计算,由于C++中自带的数据类型有储存范围,有些庞大的数字会超出储存范围,从而无法计算,所以,我们只能用一种算法去进行这种计算——高精度算法
1.什么是高精度算法
所谓高精度算法,就是模拟数据的计算过程,一般采用数组或容器来储存这些数据,今天只介绍高精度加法(因为本人目前只会这个)。例如:123。定义一个数组a,将123从低位到高位依次储存在数组中,也就是a[0]=3,a[1]=2,a[2]=1。
2.高精度加法的思路
当我们将数据储存好后,接下来就是计算。最简单的就是直接将两个数的每一位进行相加,然后输出,例如21+32=53;但加法是可以进位的,所以我们需要定义一个变量t,用来管理加法的进位,并且还需要定义两个字符型变量a,b,分别为两个加数和相加的和,然后定义三个vector类型的容器A,B,C(对于不了解vector类型的,可以参考这个链接C++ vector的用法(整理)-CSDN博客,A,B为两个加数,C为相加的和。接着编写一个函数,这也是整个算法的核心,稍后会展示代码。最后,就利用循环将C容器输出,高精度加法也就完成了
3.真题讲解(洛谷【算法1-1】模拟与高精度,P1601)
题目描述
高精度加法,相当于 a+b problem,不用考虑负数。
输入格式
分两行输入。a,b≤10^500。
输出格式
输出只有一行,代表 a+b 的值。
输入输出样例
输入 #1
1 1
输出 #1
2
输入 #2
1001 9099
输出 #2
10100
说明/提示
20% 的测试数据,0≤a,b≤10^9;
40% 的测试数据,0≤a,b≤10^18。
上代码(代码参考了wmy0217_博主)
#include<iostream>
#include<vector>
using namespace std; //这些应该不用多说了
string a,b; //定义a,b字符型变量,为两个加数
vector<int> JF(vector<int> &A,vector<int> &B){ //vector&会对原始数据产生更改,vector不会,两者注意区分
int t=0; //用来管理进位
vector<int> C;
for(int i=0;i<A.size() || i<B.size();i++){ //如果下标大于A容器或B容器长度,就停止循环,这样有助于两数相加
if(i<A.size()){ //如果下标小于A容器长度,就让t加上A[i]
t+=A[i];
}
if(i<B.size()){ //同上
t+=B[i];
}
C.push_back(t%10); //如果t>=10,就只将它的个位插入进C容器末尾,否则直接将t插入
t=t/10; //使t为0或1,判断是否需要进位
}
if(t){ //如果在两数最高位相加后t为1,就在C容器末尾插入1,进行进位
C.push_back(1);
}
return C; //返回C容器
}
int main(){
cin>>a>>b;
vector<int> A,B; //定义容器A,B,用来储存两个加数
for(int i=a.size()-1;i>=0;i--){ //将两个加数分别储存进两个容器
A.push_back(a[i]-'0'); //push_back()函数是在容器末尾插入元素,括号里可以填元素值
}
for(int i=b.size()-1;i>=0;i--){ //同上
B.push_back(b[i]-'0');
}
vector<int> C=JF(A,B); //进行高精度算法
for(int i=C.size()-1;i>=0;i--){ //将结果输出
cout<<C[i];
}
return 0;
}
这里也有一个我自己写的代码,用数组计算的,我认为我写得比较麻烦,如果有可以优化的地方请私信,因为感觉和上一个代码的思路差不多,所以就不多做解释了,这里选用数组空间1001,可根据实际情况更改
#include<iostream>
using namespace std;
int C[1001];
int main(){
string a,b;
cin>>a>>b;
int A[a.size()],B[b.size()];
int num1=0;
for(int i=a.size()-1;i>=0;i--){
A[num1]=int(a[i]-'0');
num1++;
}
num1=0;
for(int i=b.size()-1;i>=0;i--){
B[num1]=int(b[i]-'0');
num1++; //这里和上一个代码的主函数里的代码作用一样
}
int t=0,num=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[num]=t%10;
num++;
t=t/10;
} //这里也是一样
if(C[num]==0){
num=num-1;
}
if(t){
C[num+1]=1;
num=num+1; //这六行注意一下,这里的前三行代码的作用是消除前导0,后四行的作用是进位
}
for(int i=num;i>=0;i--){
cout<<C[i];
}
return 0; //收尾
}
4.总结
高精度算法是一种常用算法,生活中或者参加竞赛都会有它的身影,由此可以看出它的重要性,本文只讲解了高精度加法,以后会陆续发布高精度其他运算的解析
本文如有错误,请各位批评指出,本人第一次发布文章,一些流程有点不熟练,敬请见谅,另外,本人为初中生,最近正在准备月考和竞赛,如有消息未能及时回复,也请原谅,谢谢
如有侵权行为,请告知,本人会及时将此文章进行处理
感谢观看!!!