C ++转换为任意基数中的数字的向量表示

时间:2013-01-29 14:27:48

标签: c++ vector numbers base base-conversion

  

可能重复:
  c++ template for conversion between decimal and arbitrary base

我想将unsigned int的实例转换为基数X中的std::vector<unsigned int>实例,其中X是从2到unsigned int可以表示的最大数字的任意数字。

编辑:我曾经在基数10中说过unsigned int,但这得到了批评意见,我认为这是正确的,所以我将其删除以避免混淆。

有很多关于SO的问题和答案涵盖itoa之类的东西,它可以转换为16或32或者一些小数字(this itoa implementation page被指出为良好的资源)。我找不到比这更大的基地的转换。

注意:表现不是一个问题(在合理范围内)。

3 个答案:

答案 0 :(得分:1)

这应该这样做。

std::vector<unsigned int> result;
unsigned int base = ...;
unsigned int input = ...;
while(input) {
  result.push_back(input%base);
  input /= base;
}

答案 1 :(得分:0)

std::vector<unsigned int> toBaseX(unsigned int number, unsigned int base)
{
    std::vector<unsigned int> res;

    if (number == 0)
    {
        res.push_back(0);
        return res;
    }

    while (number > 0)
    {
        unsigned int currentDigit = number % base;
        res.push_back(currentDigit);
        number /= base;
    }
    return res;
}

答案 2 :(得分:0)

以下代码将x转换为基本base中的向量。如果需要,它还会使用额外的零填充结果向量,以满足结果向量的minSize大小。

vector<unsigned int> intToAnyBase(unsigned int x, int base, int minSize = 1) {
    assert(base >= 2);

    // minSize allows us to pad the resulting vector
    // with extra zeros at the front if needed
    minSize = std::max(1, minSize);

    std::vector<unsigned int> v;
    while(x > 0) {
        res.push_back(x % base);
        x /= base;
    }

    // Append zeros to the "front" to satisfy 'minSize' requirement.
    // This also adds support for x
    if(v.size() < minSize) {
        v.reserve(minSize);
        while(v.size() < minSize)
            v.push_back(0);
    }

    std::reverse(v.begin(), v.end());

    return v;
}

请注意,在函数中反转得到的向量,以便例如十进制4产生{1,0,0}作为结果,而不是{0,0,1}