关于高精度加法的实现可以理解为小学学习的竖式加法如下图
从各位开始按位相加,9+1=10那么我们进位1余数0,随后就是9+1+1(上一次的进位) =11商1余数1。以此类推,最后得出答案为1110。
这个过程可以由数组来模拟,我们即可得出解题思路:
1.创建三个数组分别用来存储两个加数与和
2.模拟竖式加法
3.输出和
以下是代码:
1.创建数组并且输入加数
char a[1001]={},b[1001]={};
int a1[1001]={},b1[1001]={},lena,lenb,c1[1001]={};//声明并初始化需要的数组
cin>>a>>b;//输入数字
lena = strlen(a);
lenb = strlen(b);//获取长度
for(int i=0;i<lena;i++){
a1[lena-i-1] = a[i]-48;
}
for(int i=0;i<lenb;i++){
b1[lenb-i-1] = b[i]-48;
}//倒序存储
这一步倒序存储的原因是为了下面模拟竖式加法 。
2.模拟竖式加法
int lenc=0,x=0;//声明和的长度(lenc)和进位(x)
int maxlen=max(lena,lenb);//找到加法次数(即最长的加数数组)
while(lenc<maxlen){
c1[lenc] = a1[lenc]+b1[lenc]+x;//和=加数+加数+上一次的进位
x = c1[lenc]/10;//进位=和/10
c1[lenc] = c1[lenc]%10;//最终的和= 和%10
lenc++;//使和的长度加一
}
if(x>0){//判断若最高位任然有进位
c1[lenc]=x;//最高位等于进位
lenc++;//使和的长度加1
}
在这一步,要注意最高位任然可能有进位,所以要额外判断一次 。
3.倒序输出和
for(int i=lenc-1;i>=0;i--){
cout<<c1[i];
}//倒序输出
因为存储是倒序,所以也倒序输出。
最后是该题的完整代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[1001]={},b[1001]={};
int a1[1001]={},b1[1001]={},lena,lenb,c1[1001]={};//声明并初始化需要的数组
cin>>a>>b;//输入数字
lena = strlen(a);
lenb = strlen(b);//获取长度
for(int i=0;i<lena;i++){
a1[lena-i-1] = a[i]-48;
}
for(int i=0;i<lenb;i++){
b1[lenb-i-1] = b[i]-48;
}//倒序存储;
int lenc=0,x=0;//声明和的长度(lenc)和进位(x)
int maxlen=max(lena,lenb);//找到加法次数(即最长的加数数组)
while(lenc<maxlen){
c1[lenc] = a1[lenc]+b1[lenc]+x;//和=加数+加数+上一次的进位
x = c1[lenc]/10;//进位=和/10
c1[lenc] = c1[lenc]%10;//最终的和= 和%10
lenc++;//使和的长度加一
}
if(x>0){//判断若最高位任然有进位
c1[lenc]=x;//最高位等于进位
lenc++;//使和的长度加1
}
for(int i=lenc-1;i>=0;i--){
cout<<c1[i];
}//倒序输出
return 0;
}
下期更新高精度减法。