目录
高精度运算本质上是用数组把大数存下来。
高精度加法
对于两个数123456789和123456789,如果我们要让它们相加,应该从低位开始,先让9+9,得到的结果如果大于10,则要向前进位,进位的值是t/10,留在当前位数的是t%10。
由于需要进行这个向前进位的操作,在存储大数时,我们应该逆向存储,用数组的第0位存储个位数,这样一来,当需要进位时,我们只需要在数组末尾加入一个数。
vector<int> add(vector<int> A,vector<int> B)
{
int t=0;
vector<int> C;
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);
return C;
}
高精度减法
对于两个数123456789和123456789,如果我们要让它们相减,应该从低位开始,先让9-9,得到的结果如果小于0,则要向前借位,即t=-1,留在当前位数的是(t+10)%10。
这里默认的是A>B,如果B>A,则需要交换A和B,并在结果前面加上负号。最后记得除去前导零。
vector<int> sub(vector<int> A,vector<int> B)
{
int t=0;
vector<int> C;
for(int i=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();
return C;
}
高精度乘法
和高精度加法的思路很相似,对于一个大数123456789和一个小数9,如果我们要让它们相乘,应该从低位开始,先让9*9,得到的结果如果大于10,则要向前进位,进位的值是t/10,留在当前位数的是t%10。
vector<int> mul(vector<int> A,int b)
{
int t=0;
vector<int> C;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size()) t=A[i]*b+t;
C.push_back(t%10);
t/=10;
}
return C;
}
高精度除法
对于一个大数123456789和一个小数b9,如果我们要让它们相乘,应该从高位开始,先让1/9,,则将得到的结果存入数组,余数留给下一位,存入的值是t/b,余数的值是t%b,余数顺延到下一位,需要*10。
vector<int> div(vector<int> A,int b)
{
int t=0;
vector<int> C;
for(int i=A.size()-1;i>=0;i--)
{
t=t*10+A[i];
C.push_back(t/b);
t=t%b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}