面试题答案
一键面试整体设计思路
- 数据结构:使用
vector<int>
来存储大整数的每一位,这样可以动态扩展,适合存储非常大的整数。每个元素存储对应进制下的一位数字。 - 转换算法:
- 十进制转其他进制:使用除基取余法。用目标进制数不断除十进制数,将余数依次记录下来,最后倒序排列得到转换后的数。
- 其他进制转十进制:使用按权展开法。将每一位数字乘以该位的权值(目标进制的幂),然后累加得到十进制数。
- 性能瓶颈与优化:
- 性能瓶颈:在转换过程中,大量的除法和乘法运算会消耗较多时间,特别是处理非常大的整数时。另外,频繁的内存分配和释放也会影响性能。
- 优化方案:
- 对于除法和乘法运算,可以使用快速乘和快速除算法,减少运算次数。
- 对于内存管理,可以预先分配足够的内存,减少动态内存分配的次数。
关键代码实现
#include <iostream>
#include <vector>
#include <algorithm>
// 将十进制数转换为其他进制
std::vector<int> decimalToOtherBase(int decimal, int base) {
std::vector<int> result;
while (decimal > 0) {
result.push_back(decimal % base);
decimal /= base;
}
std::reverse(result.begin(), result.end());
return result;
}
// 将其他进制数转换为十进制
int otherBaseToDecimal(const std::vector<int>& number, int base) {
int decimal = 0;
int power = 1;
for (int i = number.size() - 1; i >= 0; --i) {
decimal += number[i] * power;
power *= base;
}
return decimal;
}
// 打印结果
void printNumber(const std::vector<int>& number) {
for (int digit : number) {
if (digit < 10) {
std::cout << digit;
} else {
std::cout << static_cast<char>('A' + digit - 10);
}
}
std::cout << std::endl;
}
使用示例
int main() {
int decimalNumber = 12345;
int targetBase = 16;
std::vector<int> result = decimalToOtherBase(decimalNumber, targetBase);
std::cout << decimalNumber << " 转换为 " << targetBase << " 进制: ";
printNumber(result);
int newDecimal = otherBaseToDecimal(result, targetBase);
std::cout << "转换回十进制: " << newDecimal << std::endl;
return 0;
}
总结
通过上述设计和代码实现,我们可以高效地处理大整数在2、8、10、16进制间的转换。在实际应用中,可以根据需求进一步优化算法和数据结构,以满足更高的性能要求。