57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
|
|
#include <bits/stdc++.h>
|
|||
|
|
using namespace std;
|
|||
|
|
|
|||
|
|
const int N = 1e5 + 10; // 足够大的静态数组大小
|
|||
|
|
const int WIDTH = 4; // 压位位数
|
|||
|
|
const int BASE = 10000; // 压位基数10^4
|
|||
|
|
|
|||
|
|
int a[N], b[N]; // 静态数组存储
|
|||
|
|
int al, bl; // 有效长度
|
|||
|
|
|
|||
|
|
// 字符串转压位数组(逆序存储)
|
|||
|
|
void str2num(string s, int num[], int &sl) {
|
|||
|
|
sl = 0;
|
|||
|
|
for (int i = s.length() - 1; i >= 0; i -= WIDTH) {
|
|||
|
|
int v = 0;
|
|||
|
|
int st = max(i - WIDTH + 1, 0);
|
|||
|
|
for (int j = st; j <= i; j++)
|
|||
|
|
v = v * 10 + (s[j] - '0');
|
|||
|
|
num[sl++] = v;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 高精度加法(压位版)
|
|||
|
|
void add(int a[], int &al, int b[], int &bl) {
|
|||
|
|
// 确保a是较长的数组,如果不是则交换a和b
|
|||
|
|
// 确保a是较长的数组,如果不是则交换a和b
|
|||
|
|
if (al < bl) swap(a, b), swap(al, bl);
|
|||
|
|
|
|||
|
|
int t = 0;
|
|||
|
|
for (int i = 0; i < al; i++) {
|
|||
|
|
int bv = (i < bl) ? b[i] : 0;
|
|||
|
|
t += a[i] + bv;
|
|||
|
|
a[i] = t % BASE;
|
|||
|
|
t /= BASE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理最后的进位
|
|||
|
|
if (t) a[al++] = t;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int main() {
|
|||
|
|
string x, y;
|
|||
|
|
cin >> x >> y;
|
|||
|
|
|
|||
|
|
// 转换输入字符串为压位数组
|
|||
|
|
str2num(x, a, al), str2num(y, b, bl);
|
|||
|
|
|
|||
|
|
// 执行加法
|
|||
|
|
add(a, al, b, bl);
|
|||
|
|
|
|||
|
|
// 输出结果:最高位直接输出,后续位补前导零
|
|||
|
|
printf("%d", a[al - 1]); // 输出最高位(无前导零)
|
|||
|
|
for (int i = al - 2; i >= 0; i--)
|
|||
|
|
printf("%04d", a[i]); // 其他位保持4位宽度
|
|||
|
|
printf("\n");
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|