P1601 A+B Problem(高精)
P1601 A+B Problem(高精)
题目
高精度加法,相当于 a+b problem,不用考虑负数。
输入
分两行输入。\(a,b \le 10^{500}\)。
输出
输出只有一行,代表 \(a+b\) 的值。
样例 1
输入
1
1
输出
2
样例 2
输入
1001
9099
输出
10100
提示
\(20\%\) 的测试数据,\(0\le a,b \le10^9\);
\(40\%\) 的测试数据,\(0\le a,b \le10^{18}\)。
思路一
根据题目描述,加数均超过 \(\operatorname{long long}\) 范围,因此需要使用高精度算法。将输入进来的字符转换为整型数组,并倒序存储。从低位到高位进行相加,如果当前位相加的结果大于 \(9\),则向更高一位进位,当前的值为相加结果模 \(10\) 后的数。如果最高位也产生了进位,最终答案的长度增加一位。
代码
#include <bits/stdc++.h>
using namespace std;
char s1[505], s2[505];
int lena, lenb, lenc, a[505], b[505], c[505], x;
int main()
{
cin >> s1 >> s2;
lena = strlen(s1);
lenb = strlen(s2);
for (int i = 0; i < lena; i ++ )
a[lena - i] = s1[i] - 48;
for (int i = 0; i < lenb; i ++ )
b[lenb - i] = s2[i] - 48;
lenc = lena < lenb ? lenb : lena; // 两个数中的最长位数
for (int i = 1; i <= lenc; i ++ )
{
c[i] = a[i] + b[i] + x; // x 表示上一次的进位
x = c[i] / 10; // 计算给下一位的进位
c[i] %= 10;
}
if (x != 0)
c[++ lenc] = x;
for (int i = lenc; i >= 1; i -- )
cout << c[i]; // 输出
return 0;
}
另外,高精度的写法中,使用结构体去表达数据、重载运算符取表达运算过程也比较常见,因此需要熟练掌握。相对于高精度数组写法而言,结构体重载运算符写法代码更长,但装封性和兼容性更佳。
思路二
- 结构体存储:结构体中
len表示该数字的长度,数组s用来存储大整数的每一位。node()为结构体构造函数,用来初始化。
struct node()
{
int len, s[510];
node()
{
len = 0;
memset(s, 0, sizeof(s));
}
}
- 读入方式:与数组写法对比,不一样的地方是将计算出来的数组赋值到结构体中,在函数里返回一个结构体变量。
node read()
{
scanf("%s", str);
int len = strlen(str);
node a;
a.len = len;
for (int i = 0; i < len; i ++ )
a.s[len - i] = str[i] - '0';
return a;
}
- 重载运算符:重载加法运算符的方式是将两个结构体传入重载运算符函数,将加数的每一位进行相加赋值到一个新的结构体变量中,更新结构体变量的
s数组及数字长度,最后返回结构体变量。
node operator + (const node &a, const node &b)
{
node c;
c.len = max(a.len, b.len);
for (int i = 1; i <= c.len; i ++ )
{
c.s[i] += a.s[i] + b.s[i];
c.s[i + 1] += c.s[i] / 10;
c.s[i] %= 10;
}
if (c.s[c.len + 1])
c.len ++;
}
代码
#include <bits/stdc++.h>
using namespace std;
char str[20010];
struct node
{
int len, s[20010];
node()
{
len = 0;
memset(s, 0, sizeof(s));
}
};
node operator + (const node & a, const node & b)
{
node c;
c.len = max(a.len, b.len);
for (int i = 1; i <= c.len; i ++ )
{
c.s[i] += a.s[i] + b.s[i];
c.s[i + 1] += c.s[i] / 10;
c.s[i] %= 10;
}
if (c.s[c.len + 1])
c.len ++;
return c;
}
node read()
{
scanf("%s", str);
int len = strlen(str);
node a;
a.len = len;
for (int i = 0; i < len; i ++ )
a.s[len - i] = str[i] - '0';
return a;
}
void print(node a)
{
for (int i = a.len; i >= 1; i -- )
printf("%d", a.s[i]);
}
int main()
{
node a, b, c;
a = read();
b = read();
c = a + b;
print(c);
return 0;
}

浙公网安备 33010602011771号