前期装备
输入
高精度输入一般为字符串,需要字符串
a
各位数值存入数组(用向量代替数组)中。
//将各位数值放入数组中保存,且从个位开始
vector<int> A;
for(int i = a.size() - 1; i >= 0; i--) {
A.push_back(a[i]-'0');
}
输出
一般结果数组首位
res[0]
保存的是个位数值,即从个位开始保存,所以需要逆序
输出
for(int i = res.size() - 1; i >= 0; i--) {
cout << res[i];
}
cout << endl;
1.高精度+高精度
//加法
vector<int> add(vector<int> &A, vector<int> &B) {
vector<int> C; //保存答案,依然是从各位开始保存
//t保存进位
for(int i = 0, t = 0; i < A.size() || i < B.size() || t; i++) {
//或t的作用是方便最后进位保存至结果中
if(i < A.size()) {
t += A[i];
}
if(i < B.size()) {
t += B[i];
}
C.push_back(t % 10); //压入本位数字
t /= 10; //计算进位
}
return C;
}
2.高精度-高精度
前期准备(判断A,B大小)
//比较A, B的大小:true表示A>=B, false表示A < B
bool judge(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];
}
}
//A==B;
return true;
}
减法
//减法,保证A>=B
vector<int> sub(vector<int> &A, vector<int> &B) {
vector<int> C; //结果数组
//t表示是否借位,1借位,0不借位
for(int i = 0, t = 0; i < A.size(); i++) { //保证了A>=B,所以i<=A.size即可
A[i] = A[i] - B[i] - t;
if(A[i] < 0) { //借位
t = 1;
A[i] += 10;
}else {
t = 0;
}
C.push_back(A[i]);
}
//去除高位0,(即如果结果为00001,因除去1前面的0)
while(C.size() > 1 && !C.back()) { //C.size()>1保证了如果结果为0,则会保留一个0
C.pop_back();
}
return C;
}
3.高精度*低精度
//乘法
vector<int> mul(vector<int> &A, int b) {
vector<int> C; //结果数组
//t保存进位
for(int i = 0, t = 0; i < A.size() || t; i++) {
if(i < A.size()) {
t += A[i] * b;
}
C.push_back(t % 10); //压入本位数组
t /= 10; //计算进位
}
return C;
}
4.高精度 / 低精度
//除法
vector<int> div(vector<int> &A, int b, int &r) { //r表示余数
vector<int> C; //结果数组,从个位开始
for(int i = A.size() - 1; i >= 0; i--) {
r = r * 10 + A[i];
C.push_back(r/b); //压入本位数值
r %= b; //计算余数
}
//reverse翻转函数,除法运算时从高位开始计算的
//所以为了统一操作,使数组依然从个位开始保存需要翻转结果数组
reverse(C.begin(), C.end());
//去除高位0
while(C.size() > 1 && !C.back()) {
C.pop_back();
}
return C;
}