一、大整数的存储
大整数的存储使用数组,利用小端的思想,方便进位。
小端(little-endian):一种在内存中存放多字节数据时的字节存放次序,其中最低位所在字节存放在较低的起始地址,最高位所在字节存放在较高的结束地址。
比如,对于整数123456789:
数组 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
存储内容 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
二、高精度加法
两个非负整数相加,每一位:( 其中为前一位的进位 )
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;
}
相关题目:
AcWing 791. 高精度加法 :791. 高精度加法 - AcWing题库
洛谷 P1601 A+B Problem(高精): P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
三、高精度减法
两个非负整数相减,为了保证是较大的数减去较小的数,即计算结果为非负整数:
/*比较函数Cmp(compare),如果A>=B返回true,否则返回false*/
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){
vector<int> C;
int t = 0;
for(int i=0; i<A.size(); i++){
//t = A[i]-B[i]-t
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(); //使得001变成1
return C;
}
相关题目:
AcWing 792. 高精度减法 :792. 高精度减法 - AcWing题库
四、高精度乘低精度
vector<int> Mul(vector<int> &A, int b){
vector<int> C;
int t = 0;
for(int i=0; i<A.size() || t!=0; i++){
if(i < A.size()) t += A[i]*b;
C.push_back(t%10);
t = t/10;
}
while(C.size()>1 && C.back()==0) C.pop_back(); //去掉前导0,如0*123=000,应变为0
return C;
}
相关题目:
AcWing 793. 高精度乘法 :793. 高精度乘法 - AcWing题库
五、高精度除以低精度
vector<int> Div(vector<int> &A, int b, int &r){ //A/b, 商为C, 余数为r
vector<int> C;
r = 0;
for(int i=A.size()-1; i>=0; i--){ //除法从最高位开始
r = r*10 + A[i];
C.push_back(r/b);
r = r%b;
}
reverse(C.begin(), C.end());
while(C.size()>1 && C.back()==0) C.pop_back(); //去掉前置0
return C;
}
相关题目:
AcWing 794. 高精度除法 :794. 高精度除法 - AcWing题库