高精度(大整数)加法
概念
高精度加法大家可以把它理解为竖式计算
不过要大一些
所以,我们要储存五个数组,前两个是字符数组,用于输入,两个整型数组用于临时储存,另外一个则用于计算+输出
char sa[1000], sb[1000];
int a[1000], b[1000], c[1000];
防止计算错误,先要将c数组初始化为0
memset(c, 0, sizeof(c));
最后输出的时候,一定别忘了要反向输出
for(int i = lc - 1; i >= 0; i--)
{
printf("%d", c[i]);
}
如果忘了反向输出,用第一张竖式图片来看,那就是
9 6 2
+ 9 3
————
1 8 9 2
计算错误!!!
造成这样的原因就是地址为a[0]和b[0]的数都是9
所以我们要反向输出(反着来计算)
2 6 9
+ 3 9
————
5 5 0 1
再反向输出5501,就得到了答案1055
概念搞明白了就来看代码吧
AC代码
#include <cstdio>
#include <cstring>
using namespace std;
char sa[1000], sb[1000];
int a[1000], b[1000], c[1000];
int main()
{
scanf("%s", sa);
scanf("%s", sb);
memset(c, 0, sizeof(c));
int la = strlen(sa);
int lb = strlen(sb);
int lc = la > lb ? la : lb;
for(int i = 0; i < la; i++)
{
a[la-i-1] = sa[i] - '0'; // 反向储存a数组
}
for(int i = 0; i < lb; i++)
{
b[lb-i-1] = sb[i] - '0'; // 反向储存b数组
}
for(int i = 0; i < lc; i++)
{
c[i] += a[i] + b[i];
if(c[i] > 10) // 进位
{
c[i+1] = c[i] / 10;
c[i] %= 10;
}
}
if(c[lc] > 0) // 会新增一位的情况
{
lc++;
}
for(int i = lc - 1; i >= 0; i--)
{
printf("%d", c[i]);
}
return 0;
}
运行界面如下
未完待续