- 高精度加法
高精度加法就是把我们平常在草稿纸上的计算过程模拟在计算机中,只不过细节稍微有些不同。在数据存放时我们通常高位在左边低位在右边,而在高精度算法中是相反的,我们的运算过程是这样的
我们的代码如下
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(1);
2.高精度减法
其实我们的高精度减法和加法差不多不过我们得多一步比较的步骤,比较的代码如下:
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]; }
我们需先进行比较才能在被除数小于除数的时候输出负号
设 t = a[i] - b[i],由于a[i]和b[i]都是小于10的为了防止把负数插入数组中我们可以进行以下操作,当t大于0时(t + 10) % 10 == t小于0时t = - t;
c.push_back((t + 10) % 10)
下面进行相减的流程和高精度加法差不多
vector<int> cha(vector<int> a, vector<int> b) { vector<int> c; for(int i = 0, t = 0; i < a.size(); i ++) { 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();//去除前导0 return c; }
3.高精度乘法
我们通常把一个高精度和一个低精度数相乘,但是乘法和加减稍微有一些区别,在这个过程中我们会把a的每一位数都与b相乘代码如下
vector<int> C; int t = 0; for (int i = 0; i < a.size() || t; i ++ ) { if (i < a.size()) t += a[i] * b; C.push_back(t % 10); t /= 10; } while (C.size() > 1 && C.back() == 0) C.pop_back();//去除前导0 return C;
t的个位数我们先插入数组,而t的个位以上的数位则是作为进位来进行下一次运算
4.高精度除法
而除法又与乘法有些不同,我们之前都是从低位到高位进行运算,而除法我们是从高位到低位进行运算,在除的时候是把余数与除数进行运算,因此我们还需要有一个变量来来存储余数,步骤如下图
代码如下图所示:
vector <int> mul(vector <int> & A, int b) { vector <int> C; int t = 0; for (int i = 0; i < A.size(); i ++) { t += A[i] * b; // t + A[i] * b = 7218 C.push_back(t % 10); // 只取个位 8 t /= 10; // 721 看作 进位 } while (t) { // 处理最后剩余的 t C.push_back(t % 10); t /= 10; } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; }