对于位数较多的加法计算,会发生溢出,所以不能直接相加。
假如计算A+B,A和B各有10的6次方位,则把A、B分别看成10的六次方个元素的数组,按位相加,处理好进位,就可以实现高精度加法。
//字符串形式读入,存入数组
vector<int> add(vector<int>A,vector<int>B)//A、B都是从低位存储的,即A[0]储存个位....
{
if(A.size()<B.size())
return add(B,A);//保证A比B长
vector<int> ans;
int carry=0;//储存进位信息
for(int i=0;i<A.size();i++)
{
carry=carry+A[i];//计算本位
if(i<B.size())
carry=carry+B[i];//计算本位
ans.push_back(t%10);
t=t/10;
}
if(t==1)//最后还有进位
ans.push_back(t);
return ans;//最低位保存个位
}
高精度减法要按位相减,处理好借位
/*在读入之后进行一些处理,保证A的长度大于B
具体操作为:如果A>B,直接调用sub函数
否则,sub(B,A),在输出时先输出一个"-"*/
vector<int> sub(vector<int>A,vector<int>B)//A、B都是从低位存储的,即A[0]储存个位....
{
vector<int> ans;
int carry=0;//储存借位信息
for(int i=0;i<A.size();i++)
{
carry=carry-A[i];//计算本位
if(i<B.size())
carry=carry-B[i];//计算本位
ans.push_back((carry+10)%10);//包含t<0和t>0的情况
if(t<0)//判断借位
carry=1;
else
carry=0;
}
//返回的位数为a的位数,但存在1500-1499=1,返回0001,所以要弹出0
while(ans.size()>1&&ans.back()==0)
ans.pop_back;
return ans;//最低位保存个位
}