-3

重複の可能性:
10進数と任意の基数の間で変換するためのc++テンプレート

unsigned intのインスタンスをベースXのインスタンスに変換したいと思います。ここで、Xは2からanが表すことができるstd::vector<unsigned int>最大数までの任意の数です。unsigned int

編集:私はunsigned int10進数で言っていましたが、それは批判的なコメントを得ました、そして私はそれが正しいと思うので、混乱を避けるためにそれを削除しました。

itoaSOには、基数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;
}

結果のベクトルは関数で逆になり、たとえば、10進数の4は{1,0,0}結果として生成され、ではないことに注意してください{0,0,1}

于 2013-01-29T15:27:10.750 に答える