-3

可能重复:
用于在十进制和任意基数之间转换的 c++ 模板

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

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

SO上有很多问题和答案,涵盖了itoa转换为基数16或32或一些小数字的内容(itoa实现页面被指出为很好的资源)。对于比这大得多的碱基,我无法找到一个很好的转换。

注意:性能不是问题(在合理范围内)。

4

3 回答 3

1

这应该这样做。

std::vector<unsigned int> result;
unsigned int base = ...;
unsigned int input = ...;
while(input) {
  result.push_back(input%base);
  input /= base;
}
于 2013-01-29T14:30:56.940 回答
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;
}
于 2013-01-29T14:36:12.680 回答
0

以下代码转换x为 base 中的向量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}.

于 2013-01-29T15:27:10.750 回答