Я довольно широко искал это и не могу ничего найти. Вот проблема: преобразование числа базы 10 в очень большую базу, такую как база 400.
Цель этого просто образовательная.
Я знаю, что недостаточно символов ASCII для представления 400 различных «цифр» в базе 400, но для этой проблемы каждое значение места старшего номера базы может оставаться в базе 10. Каждое значение места старшего номера базы может быть отделено на пробел (или период) для удобочитаемости.
Пример базового числа 400:
372 0 105 50
Пример базового номера 500:
492.0.256
Пример номера базовой 1000 (это 5-значный номер в базовой 1000):
854 685 353 498 123
Любая помощь с благодарностью. Предложения по альтернативным способам представления или разделения цифр также приветствуются.
Если предположить, $number
в качестве номера источника и $base
в качестве целевой базы мы выполняем базовое преобразование, используя цикл, где для каждой итерации:
$number % $base
, Это возвращает значение текущей цифры как $digit
,$digit
от $number
, Это даст нам округленные деления позже.$number
от $base
, Поднимаем расчет на следующую цифру.$digit
,$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
Других решений пока нет …