Преобразование C ++ в векторное представление числа в любой базе

Возможный дубликат:
c ++ шаблон для преобразования между десятичной и произвольной базой

Я хотел бы преобразовать экземпляр unsigned int к примеру std::vector<unsigned int> в базе X, где X — любое число от 2 до максимального числа unsigned int может представлять.

РЕДАКТИРОВАТЬ: Я говорил unsigned int в базе 10, но это получило критические комментарии, и я думаю, что это правильно, поэтому я удалил его, чтобы избежать путаницы.

Есть много вопросов и ответов о SO, которые охватывают что-то вроде itoa который преобразует в базу 16 или 32 или некоторое небольшое число (с этот itoa страница реализации будучи отмеченным как хороший ресурс). Я не смог найти хорошее преобразование для баз, намного больших, чем это.

Примечание: производительность не является проблемой (в пределах разумного).

-3

Решение

Это должно сделать это.

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

Другие решения

Следующий код конвертирует 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},

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;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector