Преобразуйте число 10 в произвольную «имитированную» верхнюю базу в переполнении стека

Я довольно широко искал это и не могу ничего найти. Вот проблема: преобразование числа базы 10 в очень большую базу, такую ​​как база 400.

Цель этого просто образовательная.

Я знаю, что недостаточно символов ASCII для представления 400 различных «цифр» в базе 400, но для этой проблемы каждое значение места старшего номера базы может оставаться в базе 10. Каждое значение места старшего номера базы может быть отделено на пробел (или период) для удобочитаемости.

Пример базового числа 400:

372 0 105 50

Пример базового номера 500:

492.0.256

Пример номера базовой 1000 (это 5-значный номер в базовой 1000):

854 685 353 498 123

Любая помощь с благодарностью. Предложения по альтернативным способам представления или разделения цифр также приветствуются.

0

Решение

Если предположить, $number в качестве номера источника и $base в качестве целевой базы мы выполняем базовое преобразование, используя цикл, где для каждой итерации:

  1. Получить остаток от модуля $number % $base, Это возвращает значение текущей цифры как $digit,
  2. вычитать $digit от $number, Это даст нам округленные деления позже.
  3. Делить $number от $base, Поднимаем расчет на следующую цифру.
  4. Мы храним $digit,
  5. Вернуться к шагу 1 до $number равно 0,

Примеры:

Step      1         2         3         4
D=N%B     N=N-D     N=N/B         D
-----------------------------------------
512 in base 10 = 512
-----------------------------------------
512       2       510        51         2
51       1        50         5         1
5       5         0         0         5
-----------------------------------------
27 in base 2 = 11011
-----------------------------------------
27        1        26        13         1
13        1        12         6         1
6        0         6         3         0
3        1         2         1         1
1        1         0         0         1
-----------------------------------------
1234567 in base 400 = 7 286 167
-----------------------------------------
123456  167   1234400      3086       167
3086  286      2800         7       286
7    7         0         0         7

Эта процедура в кодовой форме, используя Математика произвольной точности:

// arguments must be strings
function largeBaseConvert($num, $base) {

$output = array();

while($num !== '0') {

// get remainder from modulo
$digit = bcmod($num, $base);

// substract remainder from number
$num = bcsub($num, $digit);

// divide by base
$num = bcdiv($num, $base);

// save
$output[] = $digit;
}

// need to reverse the array as we count from the lowest digit
return implode(' ', array_reverse($output));
}

Тестовое задание:

echo largeBaseConvert('1234567', '17');

Выход

14 13 4 14 10

Проверьте:

14 * 17^4 = 1169294
13 * 17^3 =   63869
4 * 17^2 =    1156
14 * 17^1 =     238
10 * 17^0 =      10
= 1234567
1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector