以洛谷P1601题目为例
题目描述
高精度加法,相当于 a+b problem,不用考虑负数。
输入格式
分两行输入。a,b≤10^500a,b≤10^500。
输出格式
输出只有一行,代表 a+b 的值。
输入输出样例
输入 #1
1 1
输出 #1
2
输入 #2
1001 9099
输出 #2
10100
计算字符串最长长度
int len1 = strlen(a); //计算字符串长度
int len2 = strlen(b);
int maxlen = len1+1;
//最长长度
if (len1 < len2)
{
maxlen = len2+1;
}
计算结果的位数以最长字符串长度(即最大加数)为主 ,数组第一位是0,maxlen要额外加一
字符串逆序存放(便于计算)
//字符串逆序存放
for (int i = 0; i < len1; i++)
{
addend1[len1 - i] = a[i] - '0'; //字符转换为数字
}
for (int i = 0; i < len2; i++)
{
addend2[len2 - i] = b[i] - '0';
}
从0下标对应位数开始运算
核心代码(模拟十进制运算)
answer[i] += addend1[i] + addend2[i];
answer[i + 1] += answer[i] / 10;
answer[i] %= 10;
将对应数位的数字相加(第一行),再对相加结果进行除以十向高位进一(第二行),最后对相加结果取余数即为该数位对应的数字(第三行)。
结果处理
if (answer[maxlen] == 0 && maxlen > 0)
{
maxlen--;
}
最后要将结果做些处理,如果没有这个操作,输出的数字前面会多出0,例如输入25 25,结果会输出050,很显然要将前面多出的0删除。首先考虑特殊情况0+0,结果只有一位数0,不需要删除前导0。maxlen==0时,只有一位数,所以maxlen>0即可。maxlen对应的是最高数位的下标,answer[manlen]==0表示最高数位为0,此时将maxlen--后移一位。
完整代码
#include<stdio.h>
#include<string.h>
//高精度算法
//高精度加法
int addend1[600], addend2[600]; //加数
int answer[600]; //两数之和
char a[600] = { 0 }; //存放字符串
char b[600] = { 0 };
int main()
{
scanf("%s%s", a, b);
int len1 = strlen(a); //计算字符串长度
int len2 = strlen(b);
int maxlen = len1+1;
//最长长度
if (len1 < len2)
{
maxlen = len2+1;
}
//字符串逆序存放
for (int i = 0; i < len1; i++)
{
addend1[len1 - i] = a[i] - '0'; //字符转换为数字
}
for (int i = 0; i < len2; i++)
{
addend2[len2 - i] = b[i] - '0';
}
//模拟加法运算
for (int i = 1; i <= maxlen; i++)
{
answer[i] += addend1[i] + addend2[i];
answer[i + 1] += answer[i] / 10;
answer[i] %= 10;
}
//删除前导0
if (answer[maxlen] == 0 && maxlen > 0)
{
maxlen--;
}
//输出结果
for (int i = maxlen; i > 0; i--)
{
printf("%d", answer[i]);
}
return 0;
}