P1601 A+B Problem(高精)
P1601 A+B Problem(高精)
题目
高精度加法,相当于 a+b problem,不用考虑负数。
输入
分两行输入。
输出
输出只有一行,代表
样例 1
输入
1
1
输出
2
样例 2
输入
1001
9099
输出
10100
提示
思路一
根据题目描述,加数均超过
代码
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效