P1604 B 进制星球
问题背景
这道题要求我们编写一个支持任意进制(2 <= B <= 36)的加法计算器。虽然核心逻辑是高精度加法,但难点在于字符与数值的转换以及进位处理。
解题思路
处理这类问题的关键在于将字符串形式的数字转换为数值数组存储。通常我们会采用逆序存储,即下标 0 存放个位,这样在计算进位时可以直接操作数组头部,无需频繁移动数据。
对于大于 9 的数字,题目约定使用 A-Z 表示。因此,输入时需要判断字符范围:如果是 '0'-'9',直接减去 '0';如果是 'A'-'Z',则需减去 'A' 并加上 10。输出时同理,根据余数大小决定打印数字还是字母。
具体步骤如下:
- 数据预处理:读取进制 B 和两个加数字符串,分别转换为整型数组
A和B,低位在前。 - 逐位相加:从低位到高位遍历,累加对应位及上一位的进位
temp。 - 进位处理:当前位的结果为
temp % k,新的进位为temp / k。 - 结果格式化:将数值转回字符存入结果容器,最后去除可能产生的前导零,逆序输出。
注意循环次数要覆盖到最大长度 + 1,以防最高位产生进位。同时,如果最终结果的最高位是 0(例如 0+0=0),需要将其剔除。
参考实现
下面是完整的 C++ 代码,重点展示了字符转换和进位循环的逻辑。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
int k; // 进制
string a, b;
int A[2001], B[2001];
vector<char> C;
cin >> k >> a >> b;
// 将字符串转为数值数组,低位在前
for (int i = 0; i < a.size(); i++)
if (a[a.size() - 1 - i] >= 'A')
A[i] = a[a.size() - 1 - i] - + ;
A[i] = a[a.() - - i] - ;
( i = ; i < b.(); i++)
(b[b.() - - i] >= )
B[i] = b[b.() - - i] - + ;
B[i] = b[b.() - - i] - ;
n = a.() > b.() ? a.() : b.();
temp = ;
s;
( i = ; i <= n; i++)
{
(i < a.() && i < b.())
temp += A[i] + B[i];
(i >= a.() && i < b.())
temp += B[i];
(i < a.() && i >= b.())
temp += A[i];
(temp % k >= )
s = + (temp % k) - ;
s = temp % k + ;
C.(s);
temp /= k;
}
(C.(C.() - ) == )
C.();
( i = ; i < C.(); i++)
cout << C.(C.() - i - );
;
}

