P1601 A+B Problem(高精)
题目描述
高精度加法,相当于a+b problem,不用考虑负数.
输入格式
分两行输入。a,b \leq 10^{500}a,b≤10
500
输出格式
输出只有一行,代表a+ba+b的值
输入输出样例
输入 #1复制
1
1
输出 #1
2
输入 #2
1001
9099
输出 #2
10100
题解
这里想到的是把两个加数从尾部对齐,放在数组从尾部到头部来加,处理好进位,记录好长度即可。
#include <iostream>
#include <cstring>
#include <cstdio>
struct Num {
char num[501];
int st;
int len;
};
typedef struct Num NUM;
void moveToRight(NUM& num);
Num plusNum(NUM& n1, NUM& n2);
int main()
{
NUM n1, n2;
scanf("%s", n1.num);
scanf("%s", n2.num);
n1.st = n2.st = 0;
n1.len = strlen(n1.num);
n2.len = strlen(n2.num);
moveToRight(n1);//右对齐
moveToRight(n2);
NUM ans = plusNum(n1, n2);
for (int i = ans.st - ans.len + 1; i <= ans.st; i++)
{
printf("%c", ans.num[i]);
}
printf("\n");
}
void moveToRight(NUM& num)
{
int ptr = 500;
for (int i = num.len - 1; i >= 0; i--)
{
num.num[ptr] = num.num[i];
ptr--;
}
num.st = 500;
for (int i = num.st - num.len; i >= 0; i--)
{
num.num[i] = '\0';
}
}
Num plusNum(NUM& n1, NUM& n2)
{
int len = n1.len > n2.len ? n1.len : n2.len;
int tmp = 0;
NUM ans;
ans.len = 0;
ans.st = 500;
for (int i = 0; i <= 500; i++)
{
ans.num[i] = 0;
}
for (int i = 0; i < len; i++)
{
int loc = 500 - i;
if (tmp == 1)
{
ans.num[loc] += 1;
tmp = 0;
}
if (n1.num[loc] == '\0')
n1.num[loc] = '0';
if (n2.num[loc] == '\0')
n2.num[loc] = '0';
ans.num[loc] += n1.num[loc] - '0' + n2.num[loc] - '0';
if (ans.num[loc] >= 10)
{
ans.num[loc] -= 10;
tmp = 1;
}
ans.num[loc] += '0';
ans.len++;
}
if (tmp == 1)
{
ans.len++;
ans.num[ans.st - ans.len+1] = '0' + 1;
tmp = 0;
}
return ans;
}