概览
大整数的计算
A + B
A * a
A / a
- 大整数存储
为了最高位进行加1,所以存储一般反着存储,数组低位存实际数据的高位 - 算法过程
模拟实际运行过程,即进行位与位的加法
保存一个全局变量
+a
+b
如果有多余的位,然后再考虑加位
题解
代码
不压位
#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B){
if(A.size()<B.size()) return add(B,A);
int t=0;
vector<int> c;
for(int i=0;i<A.size();i++){
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;
vector<int> 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]);
return 0;
}
压9位 todo, 查看视频来源是怎么做的
高精度压位
int_max 210^10
加法一般压9位
乘法一般压4位 1000010000=1e8
实际上的想法就是在进行高精度计算的时候,一位一位用char来做太费时间和内存了;可以考虑用int来做,
加法9位9位地压,乘法4位4位地压
#include<iostream>
#include<vector>
using namespace std;
const int base=1e9;
vector<int> add(vector<int> &A, vector<int> &B){
if(A.size()<B.size()) return add(B,A);
vector<int> c;
int t=0;
for(int i=0;i<A.size();i++){
if(i<B.size()) t+=B[i];
t+=A[i];
c.push_back(t%base);
t/=base;
}
if(t) c.push_back(t);
return c;
}
int main(){
string a,b;
cin>>a>>b;
vector<int> A,B;
// 数组模拟vector, 时间复杂度 n/9
for(int i=a.size()-1,s=0,j=0,t=1;i>=0;i--)
{
s += (a[i]-'0')*t;
t*=10;
j++;
if(j==9 || i==0) {
A.push_back(s);
t=1,s=0,j=0;
}
}
for(int i=b.size()-1, s=0, j=0, t=1;i>=0;i--)
{
s += (b[i]-'0')*t;
t*=10, j++;
if(j==9 || i==0) {
B.push_back(s);
t=1,s=0,j=0;
}
}
auto c=add(A,B);
cout<<c.back();
for(int i=c.size()-2;i>=0;i--) printf("%09d",c[i]);
return 0;
}