首先观察我们在竖式加法时的做法
str1=“3216”
str2=“999765”
3216
+ 999765
---------
1002981
- 对位(将str1的各位6和str2的各位5对齐,倒序存储就是为了对位和计算的方便)
- 从最低位开始依次相加,相加的时候要处理进位
主程序分为三个模块来处理 - 读数
- 加法处理
- 输出
int main(){
int a[N],b[N];
memset(a,0,sizeof(a)); //对a数组进行清零处理,在库<cstring>中
memset(b,0,sizeof(b));
Read(a); //读入第一个加数存到a数组中
Read(b); //读入第一个加数存到b数组中
Add(a,b); //将a和b加起来,将和存到a数组中
Out(a); //将和a输出
return 0;
}
然后分模块去进行分别处理
void Read(int a[]){ //读数模块
string s;
cin>>s; //用字符串读入该数
a[0]=s.size(); //存储该数的长度,也可用a[0]=s.length();
for(int i=1;i<=a[0];i++)
a[i]=s[a[0]-i]-'0'; //i和a[0]-i实现下标的倒序,-‘0’实现字符和整数的转换,注意字符串的下标是从0到a[0]-1,整数数组下标是从a[0]到1
return ;
}
void Add(int a[],int b[]){//相加模块
if(a[0]<b[0])a[0]=b[0]; //和存储在a数组中,a[0]要保证能加到两个数的最高位
for(int i=1;i<=a[0];i++){
a[i]+=b[i]; //存储和
a[i+1]+=a[i]/10; //处理进位,将进位加到上一位去
a[i]%=10; //去掉进位后的数值。处理进位也可以改成if(a[i]>9) a[i+1]++,a[i]-=10;
}
if(a[a[0]+1]>0) a[0]++; //如果最高位上有进位,则结果位数要加一位
return;
}
void Out(int a[]){
for(int i=a[0];i>0;i--)cout<<a[i]; //倒序输出每一位,有时候需要处理最高位上有0的情况,具体情况再具体处理
return;
}