高精度运算指处理超过标准数据类型范围的大数进行运算,大数通常被表示为多个块(包含一位或几位)),这些块分别存储在数组或其他数据结构中,通过运算规则来模拟加法、减法、乘法等操作。
1.高精度整数存储
字符串读入,采用小端存储方式(可以支持运算产生的进位)将每一位存储到vector数组中
2.高精度运算
2.1 高精度整数加法A+B
按位相加法:
Ci = (Ai+Bi+t) % 10 t = (Ai+Bi+t) / 10
【t是上一位进位】
#include <iostream>
#include <vector> // 用vector表示大整数
using namespace std;
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 = t/10;
}
if(t) C.push_back(t);
return C;
}
int main(){
string a,b;
vector<int> 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');
}
vector<int> C = add(A,B);
for(int i = C.size()-1;i>=0;i--){
cout << C[i];
}
cout<<endl;
return 0;
}
2.2 高精度整数减法A-B
按位相减法:
Ci = Ai-Bi-t 或者 Ai+10-Bi-t 【t是上一位借位】
A>=B, return sub(A,B)
A<B, return -sub(B,A)
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]-t;
if(i<B.size()) t = t-B[i];
C.push_back((t+10)%10); // 讨论了是否需要进位的两种情况
if(t<0) t=1; // 需要进位
else t = 0; // 不需要进位
}
// 去掉高位多余的0,如123-120 = 003,现在计算出来的C与A的位数是相同的。
// 如果减法最最终为0,则不能删除最后一位的0
while(C.size()>1 && C.back() == 0){
C.pop_back();
}
return C;
}
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; // A = B
}
int main(){
string a,b;
vector<int> 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');
}
vector<int> C;
if(cmp(A,B)){ // 判断A>=B
C = sub(A,B);
}else{
C = sub(B,A);
cout<<'-';
}
for(int i = C.size()-1;i>=0;i--){
cout << C[i];
}
cout<<endl;
return 0;
}
2.3 高精度整数乘法A*b
按位相乘法:
Ci = (Aib+t) % 10 t = (Aib+t) / 10
【t是上一位借位】
vector<int> mul(vector<int>& A,int b){
vector<int> C;
int t = 0;
for(int i=0; i<A.size() || t;i++){ //当A[i]还没循环完或者进位还没有处理完成
if( i < A.size() ) t = A[i]*b+t;
C.push_back(t%10);
t = t/10;
}
// 因为t可能是一个多位数,不能直接push_back(t)
// 考虑b=0的情况
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main(){
string a;
vector<int> A;
int b;
cin>>a>>b;
for(int i = a.size()-1;i>=0;i--){
A.push_back(a[i]-'0');
}
vector<int> C = mul(A,b);
for(int i = C.size()-1;i>=0;i--){
cout << C[i];
}
cout<<endl;
return 0;
}
2.4 高精度整数除法A/a
按位相除法:从高位到低位计算
#include <iostream>
#include <vector> // 用vector表示大整数
#include <algorithm>
using namespace std;
vector<int> div(vector<int>& A,int b,int& r){ //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;
}
// 调转C的存储顺序
reverse(C.begin(),C.end());
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main(){
string a;
vector<int> A;
int b;
cin>>a>>b;
for(int i = a.size()-1;i>=0;i--){
A.push_back(a[i]-'0');
}
int r;
vector<int> C = div(A,b,r);
for(int i = C.size()-1;i>=0;i--){
cout << C[i];
}
cout<<endl<<r<<endl;
return 0;
}