刚写完高精度乘法,现在来写一下高精度加法,同样也是模拟算法
代码:
#include<bits/stdc++.h>
using namespace std;
char s[110];
int a[110],b[110],c[110];
int la,lb,lc;
int main(){
scanf("%s",s+1);
la=strlen(s+1);
for(int i=1;i<=la;i++)
a[i]=s[la-i+1]-'0';
scanf("%s",s+1);
lb=strlen(s+1);
for(int i=1;i<=lb;i++)
b[i]=s[lb-i+1]-'0';
if(la<lb)
lc=lb;
else
lc=la;
for(int i=1;i<=101;i++)
c[i]=0;
for(int i=1;i<=101;i++){
c[i]=a[i]+b[i]+c[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
if(c[lc+1]>0)
lc++;
for(int i=lc;i>=1;i--)
printf("%d",c[i]);
return 0;
}
代码讲解
首先还是一样的,先输入,转换为数字并且倒叙存储:
#include <iostream>
#include <cstring>
using namespace sdt;
int main(){
char s1[512],s2[512];
int n1[512],n2[512];
scanf("%s%s",s1,s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
for (int i = 0;i<len1;i++){
n1[i] = s1[len-1-i] - '0';
}
for (int i = 0;i<len2;i++){
n2[i] = s2[len-1-i] - '0';
}
return 0;
}
核心代码
我们模拟平时做竖式加法的过程就可以了:
核心代码:
int lenans = max(len1,len2);
int in = 0;//记载进位
for(int i = 0;i < lenans;i++)
{
ans[i] = n1[i] + n2[i] + in;
in = ans[i] / 10;
ans[i] = ans[i] % 10;
}
if(in)//如果最后还有进位,那就新加一位
{
ans[lenans] = in;
lenans++;
}
for(int i = len_ans - 1;i >= 0;i--)
{
cout << ans[i];
}
完整代码:
#include <iostream>
#include <cstring>
using namespace sdt;
int main(){
char s1[512],s2[512];
int n1[512],n2[512];
int ans[512];
scanf("%s%s",s1,s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
for (int i = 0;i<len1;i++){
n1[i] = s1[len-1-i] - '0';
}
for (int i = 0;i<len2;i++){
n2[i] = s2[len-1-i] - '0';
}
int lenans = max(len1,len2);
int in = 0;//记载进位
for(int i = 0;i < lenans;i++)
{
ans[i] = n1[i] + n2[i] + in;
in = ans[i] / 10;
ans[i] = ans[i] % 10;
}
if(in)//如果最后还有进位,那就新加一位
{
ans[lenans] = in;
lenans++;
}
for(int i = len_ans - 1;i >= 0;i--)
{
cout << ans[i];
}
return 0;
}
效果:
多大的数字都没有问题