1 高精度加法
存储:从高位开始存,第0位存个位,第1位存十位……
好处:我们这个要进位,需要在高位上补一个数,在数组末尾补上一个数最容易
运算是一个模拟人工加法的过程
具体过程如下
$a_0$ 先加 $b_0$,如果大于 $10$,进位,如果小于 $10$,就不进位。下一个 $a_1$ + $b_1$ 加上进位(前一位的结果%10
)
如果这一位不存在,看成 $0$ 就可以
最后看看有没有进位,进位了就在最后补一个 $1$
#include<bits/stdc++.h>
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++){//遍历一遍A和B数组,直到两个数组都遍历完为止
if(i<A.size())t+=A[i]; //如果没有遍历完A数组,t加上a当前位上的值
if(i<B.size())t+=B[i]; //如果没有遍历完A数组,t加上a当前位上的值
C.push_back(t%10); //因为有可能进位,所以要push上的是t%10
t/=10; //如果t大于10,也就是进过位了,所以要/10
}
if(t)C.push_back(1); //如果最高位还要进1,进1
return C; //返回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'); //把a倒序
for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0'); //把b倒序
auto C=add(A,B);
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
return 0;
}
未完待续!
2 高精度减法
存储格式与加法一样一样
还是使用竖式
$a_i$ 减 $b_i$ 分两种情况,1.这一位大于 $0$(直接算 $a_i-b_i-t$)2.小于 $0$($a_i-b_i+10-t$)
高精度减法要保证 $a$ 数组是大于 $b$ 数组的
如果 $a$ 小于 $b$,那么就算 $b$ 减 $a$,再在前面加一个负号
tql