说明:
在本代码中大数 12345(即一万两千三百四十五)在vector中以相反顺序存储,可以想象vector以原点为起点,向x轴负方向增长。
由于我比较懒,只实现了正整数的加减乘除,其中减法a-b要求a>b,否则返回0;除法a/b要求a>b,否则返回0;
vector<int>a ={
5,4,3,2,1};
即 下标为零的位置为个位。
如图。
实现思路 通过模拟人在纸上手动四则运算的过程来实现高精度。
加减法中需要先将短的数在高位补零,123(一百二十三)+2345(二百三十四)时,将123补为0123。
vector<int>a;//左操作数
vector<int>b;//右操作数
vector<int>c;//结果数组
int ad=0;//进位 或者借位标志。
- 加法:从个位开始按位相加,当前位结果为 ( a [ i ] + b [ i ] + a d ) % 10 (a[i]+b[i]+ad)\%10 (a[i]+b[i]+ad)%10,进位为 ( a [ i ] + b [ i ] + a d ) / 10 (a[i]+b[i]+ad)/10 (a[i]+b[i]+ad)/10,注意运算完成后如果进位不为0需要把进位作为最高位。
- 减法:从个位开始按位相减
- 如果当前a[i]-ad >=b[i] : c[i]=a[i]-ad -b[i]; ad=0;
- 如果当前a[i]- ad < b[i]: c[i]=a[i]-ad+10-b[i]; ad=1;
- 因为a>b,所以最后ad一定是0;
- 乘法:从个位开始按位相乘,但是注意a[i]与b乘完之后的结果要进位,如图是a的值为34(vectora={4,3}),b的值为123(vectorb={3,2,1})的情况。
如图
-
每一位乘积左移
- 当i等于0时,a[i]*b的结果不需要左移
- 当i等于1时,a[i]*b的结果需要左移一位,即在低位添加一个0占位。
- 即结果数组的低位需要提前添加i个0来占位。
-
除法 除法是大数里面最麻烦的,可以转化为减法来做。
先来看一个简单的10/2的情况
int a=10,b=2;
int re=0;
while(a>=b){
a=a-b;
re++;
}
cout<<re;
在大数除法中也是采用这种减法来做,我们先将短的数b与长的数a对齐,然后用a-b,够减当前位的值加一,直到不够减就将b除以10,然后计算下一位的结果。如图:
当b的值小于b的初值的时候,循环结束。
代码如下
#include<iostream>
#include<stack>
#include<vector>//数组方向为x轴负方向。
#include<string>
using namespace std;
int com(const vector<int>& a, const vector<int>& b) {
if (a.