zhangas

Pay more attention

0%

高精度计算

加法 A+B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vector<int> add(vector<int> &a,vector<int> &b){//默认字符串a的长 
vector<int>c;//加上引用不用拷贝整个数组 可以加快效率
if(a.size()<b.size()){
return add(b,a);
}
int t=0;//处理进位问题
for(int i=0;i<a.size();i++){
t+=a[i];
if(i<b.size()){
t+=b[i];
}
c.push_back(t%10);
t/=10;
}
if(t){//若最高位向前进了1 则添加到c中
c.push_back(t);
}
return c;
}

减法 A-B

需要判断读入A和B的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//比较A和B的大小 
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> subtraction(vector<int>&a,vector<int>&b){
vector<int>c;//计算A-B
for(int i=0,t=0;i<a.size();i++){
t=a[i]-t;
if(i<b.size()){//判断b是不是已经越界了
t-=b[i];
}
c.push_back((t+10)%10);
//等价于判断t<0时候 t+=10 t<10时 直接在尾部添加t
t=t<0?1:0;//更新t 若借一 t在下次循环要减去一
}
while(c.size()>1&&c.back()==0){//例如123-120=3 容器c的长度和a一样 返回的应该是003
c.pop_back();//删除容器尾部元素
}
return c;

}

乘法 A*b

1
2
3
4
5
6
7
8
9
10
11
12
13
vector<int> multiple(vector<int>a,int b){
vector<int>c;
int t=0;
for(int i=0;i<a.size();i++){
t+=a[i]*b;
c.push_back(t%10);
t/=10;
}
if(t){//t不为零时 可以加到c的最高位上
c.push_back(t);
}
return c;
}

除法