> 好久没更新了,更一篇,好冷门的题目
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目分析
题目核心是实现 B 进制(2≤B≤36)的大数加法,由于数字长度可达 2000 位,无法用常规数值类型存储,需通过字符串模拟手工加法过程:从低位到高位逐位相加,处理进位,最后将结果反转输出。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题解代码(还没完,向下看)
核心逻辑说明
1. 字符转数值(c函数):将 B 进制字符(0-9、A-Z)转为十进制整数,如 'A' 转 10、'3' 转 3。
2. 数值转字符(d函数):将十进制整数转回 B 进制字符,如 11 转 'B'、5 转 '5'。
3. 加法流程:
* 反转两个输入字符串,方便从低位(字符串头部)开始相加;
* 逐位取数相加,加上进位,计算当前位值(sum % B)和新进位(sum / B);
* 处理完所有位和进位后,反转结果字符串,得到最终 B 进制和。
但我们会发现,这实在是太慢了(本人第一代代码用了1MS)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
因此改用 <CSTDIO> 的代码(可放心食用)
核心修改说明
1. 输入输出替换:
* 用 scanf 替代 cin 读取进制 B 和两个 B 进制字符串;
* 用 putchar 替代 cout 输出结果,避免字符串反转操作,直接从结果数组末尾向前遍历输出。
2. 存储方式调整:
* 改用字符数组(char[])存储输入和结果,替代 C++ string,更贴合 <cstdio> 风格;
* 用 strlen 获取字符串长度,memset 初始化结果数组。
3. 结果输出优化:
* 不再反转结果数组,而是从最后一位(k-1)向前遍历到第一位(0),直接输出,减少一次反转操作。
总结
1. 核心逻辑保持不变:字符与数值的双向转换、逐位相加处理进位.
2. 输入输出完全改用 <cstdio> 库函数,存储改用字符数组.
3. 优化结果输出流程,省去反转结果数组的步骤.。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
蒜鸟蒜鸟,睡觉