MST

星途 面试题库

面试题:C++高效实现多进制转换(十进制与十六进制及任意进制间)

编写一个C++类,提供方法可以将十进制数转换为十六进制字符串,并能够将十六进制字符串转换回十进制数。同时,实现一个通用方法,可以将十进制数转换为任意进制(2 - 36进制)的字符串表示,以及反向转换。要注重效率,合理使用C++的特性,例如模板、STL容器等。
30.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

class NumberConverter {
public:
    // 将十进制数转换为十六进制字符串
    static std::string decimalToHexadecimal(int decimal) {
        return decimalToBase(decimal, 16);
    }

    // 将十六进制字符串转换回十进制数
    static int hexadecimalToDecimal(const std::string& hexadecimal) {
        return baseToDecimal(hexadecimal, 16);
    }

    // 将十进制数转换为任意进制(2 - 36进制)的字符串表示
    static std::string decimalToBase(int decimal, int base) {
        if (base < 2 || base > 36) {
            throw std::invalid_argument("Base must be between 2 and 36");
        }

        if (decimal == 0) return "0";

        bool isNegative = decimal < 0;
        if (isNegative) decimal = -decimal;

        std::string result;
        while (decimal > 0) {
            int remainder = decimal % base;
            result += remainder < 10? '0' + remainder : 'A' + remainder - 10;
            decimal /= base;
        }

        if (isNegative) result += '-';
        std::reverse(result.begin(), result.end());
        return result;
    }

    // 将任意进制(2 - 36进制)的字符串表示转换回十进制数
    static int baseToDecimal(const std::string& number, int base) {
        if (base < 2 || base > 36) {
            throw std::invalid_argument("Base must be between 2 and 36");
        }

        bool isNegative = number[0] == '-';
        int startIndex = isNegative? 1 : 0;

        int result = 0;
        for (size_t i = startIndex; i < number.length(); ++i) {
            int digit = number[i] >= '0' && number[i] <= '9'? number[i] - '0' :
                number[i] >= 'A' && number[i] <= 'Z'? number[i] - 'A' + 10 :
                number[i] >= 'a' && number[i] <= 'z'? number[i] - 'a' + 10 : -1;

            if (digit == -1 || digit >= base) {
                throw std::invalid_argument("Invalid digit for given base");
            }

            result = result * base + digit;
        }

        return isNegative? -result : result;
    }
};

你可以这样使用这个类:

int main() {
    try {
        std::cout << "10进制转16进制: " << NumberConverter::decimalToHexadecimal(42) << std::endl;
        std::cout << "16进制转10进制: " << NumberConverter::hexadecimalToDecimal("2A") << std::endl;
        std::cout << "10进制转2进制: " << NumberConverter::decimalToBase(42, 2) << std::endl;
        std::cout << "2进制转10进制: " << NumberConverter::baseToDecimal("101010", 2) << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}

上述代码中,NumberConverter类提供了以下功能:

  1. decimalToHexadecimal方法将十进制数转换为十六进制字符串。
  2. hexadecimalToDecimal方法将十六进制字符串转换为十进制数。
  3. decimalToBase方法将十进制数转换为任意进制(2 - 36进制)的字符串表示。
  4. baseToDecimal方法将任意进制(2 - 36进制)的字符串表示转换为十进制数。

main函数中展示了这些方法的使用示例,并处理了可能的异常情况。