高精度加法
思路:
1.首先创建两个字符串a,b分别储存要进行加法的两个数字,此时为正序排列
2.创建三个数组a1,b1,c并初始化,两个用来储存逆序后的数字(因为根据加法列竖式时是从个位开始相加),一个用来储存逆序后对应位数相加的数,并后续逆序输出
3.输入a,b并将其逆序存入数组a1,b1中
4.将a1,b1相加并存入数组c中(此时仍为逆序)
5.判断是否有进位现象,以及是否有因最高位进位而导致数组长度发生变化,若存在,则数组长度+1
6.将数组c逆序输出
是不是很简单呢~
以下是两种不同的编码样例,但本质是一样的~
#include <iostream>
using namespace std;
int main(){
string a,b;//创建两个字符串
int a1[201]={0},b1[201]={0},c[202]={0};//定义数组并初始化为0 数组长度根据实际情况变化
getline(cin,a);
getline(cin,b);//输入两个数
int s1=a.size();
int s2=b.size();//得到两个数组的长度
for(int i=a1[i];i<s1;i++){
a1[s1-i-1]=a[i]-'0';
}
for(int i=b1[i];i<s2;i++){
b1[s2-i-1]=b[i]-'0';
} //字符串逆序存入数组
int len=s1;
if(s2>s1){
len=s2;
}//循环次数取决于两个数组中较长的
for(int i=0;i<len;i++){
c[i]=a1[i]+b1[i];
}//将a1,b1数组相加并存入c中
for(int i=0;i<len;i++){
if(c[i]>=10){
c[i+1]+=c[i]/10;//进位
c[i]%=10;//保留进位后的数字
}
}
if(c[len]!=0)
len++;//判断最高位是否发生进位
for(int i=len-1;i>=0;i--)
cout<<c[i];//将数组c逆序输出
return 0;
}
相信你应该已经明白了吧
让我们来看第二个
#include <iostream>
using namespace std;
string a,b;
int a1[501],b1[501],c1[501];
int main(){
cin>>a>>b;
//逆序存放并转成整数
int la=a.size();
for(int i=0;i<la;i++){
a1[i]=a[la-i-1]-'0';
}
int lb=b.size();
for(int i=0;i<lb;i++){
b1[i]=b[lb-i-1]-'0';
} //逆序存放
//测试
// for(int i=0;i<l;i++){
// cout<<a1[i];
// }
//模拟竖式
int lc=0;
int jw=0,i;//初始化进位为 0
for(i=0;i<max(la,lb);i++){
c1[i]=a1[i]+b1[i]+jw;
jw=c1[i]/10;
c1[i]%=10;
}
if(jw>0){
c1[i]=jw;
lc=i+1;
}else lc=i;
cout<<"----------"<<endl;
for(int i=lc-1;i>=0;i--){
cout<<c1[i];
}
return 0;
}
这回是不是明白了嘛?
今天我们就学到这里,要记得勤加练习哦~ (我也是),让我们共同努力吧~!
加油!