题解>>>B进制大数加法
2026-03-15 17:11:51
发布于:天津
8阅读
0回复
0点赞
好久没更新了,更一篇,好冷门的题目
题目分析
题目核心是实现 B 进制(2≤B≤36)的大数加法,由于数字长度可达 2000 位,无法用常规数值类型存储,需通过字符串模拟手工加法过程:从低位到高位逐位相加,处理进位,最后将结果反转输出。
题解代码(还没完,向下看)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int c(char ch) {
if (ch >= '0' && ch <= '9') return ch - '0';
return ch - 'A' + 10;
}
char d(int x) {
if (x < 10) return x + '0';
return x - 10 + 'A';
}
int main() {
int B;
string a, b, res;
cin >> B >> a >> b;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int i = 0, j = 0, carry = 0;
while (i < a.size() || j < b.size() || carry) {
int x = 0, y = 0;
if (i < a.size()) x = c(a[i++]);
if (j < b.size()) y = c(b[j++]);
int sum = x + y + carry;
res += d(sum % B);
carry = sum / B;
}
reverse(res.begin(), res.end());
cout << res << endl;
return 0;
}
核心逻辑说明
- 字符转数值(c函数):将 B 进制字符(0-9、A-Z)转为十进制整数,如 'A' 转 10、'3' 转 3。
- 数值转字符(d函数):将十进制整数转回 B 进制字符,如 11 转 'B'、5 转 '5'。
- 加法流程:
- 反转两个输入字符串,方便从低位(字符串头部)开始相加;
- 逐位取数相加,加上进位,计算当前位值(
sum % B)和新进位(sum / B); - 处理完所有位和进位后,反转结果字符串,得到最终 B 进制和。
但我们会发现,这实在是太慢了(本人第一代代码用了1ms)
因此改用 <cstdio> 的代码(可放心食用)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int c(char ch) {
if (ch >= '0' && ch <= '9') return ch - '0';
return ch - 'A' + 10;
}
char d(int x) {
if (x < 10) return x + '0';
return x - 10 + 'A';
}
int main() {
int B;
char a[2001], b[2001], res[2002];
memset(res, 0, sizeof(res));
scanf("%d%s%s", &B, a, b);
int la = strlen(a), lb = strlen(b);
reverse(a, a + la);
reverse(b, b + lb);
int i = 0, j = 0, carry = 0, k = 0;
while (i < la || j < lb || carry) {
int x = 0, y = 0;
if (i < la) x = c(a[i++]);
if (j < lb) y = c(b[j++]);
int sum = x + y + carry;
res[k++] = d(sum % B);
carry = sum / B;
}
for (int p = k - 1; p >= 0; p--) {
putchar(res[p]);
}
putchar('\n');
return 0;
}
核心修改说明
- 输入输出替换:
- 用
scanf替代cin读取进制 B 和两个 B 进制字符串; - 用
putchar替代cout输出结果,避免字符串反转操作,直接从结果数组末尾向前遍历输出。
- 用
- 存储方式调整:
- 改用字符数组(
char[])存储输入和结果,替代 C++string,更贴合<cstdio>风格; - 用
strlen获取字符串长度,memset初始化结果数组。
- 改用字符数组(
- 结果输出优化:
- 不再反转结果数组,而是从最后一位(
k-1)向前遍历到第一位(0),直接输出,减少一次反转操作。
- 不再反转结果数组,而是从最后一位(
总结
- 核心逻辑保持不变:字符与数值的双向转换、逐位相加处理进位.
- 输入输出完全改用
<cstdio>库函数,存储改用字符数组. - 优化结果输出流程,省去反转结果数组的步骤.。
蒜鸟蒜鸟,睡觉
全部评论 1
可安全生食
1周前 来自 天津
1QaQ
1周前 来自 天津
0






有帮助,赞一个