Я пытаюсь разбить число на массив чисел (в php), например, так:
- 25 становится (16, 8, 1)
- 8 становится (8)
- 11 становится (8, 2, 1)
Я не знаю, каков правильный термин, но я думаю, что идея ясна.
Мое решение с циклом довольно простое:
$number = rand(0, 128);
$number_array_loop = array();
$temp_number = $number;
while ($temp_number > 0) {
$found_number = pow(2, floor(log($temp_number, 2)));
$temp_number -= $found_number;
$number_array_loop[] = $found_number;
}
У меня также есть рекурсивное решение, но я не могу заставить это работать без использования глобальной переменной (не хочу этого), следующее близко, но приводит к массивам в массивах:
function get_numbers($rest_number) {
$found_number = pow(2, floor(log($rest_number, 2)));
if ($found_number > 0) {
$temp_array[] = get_numbers($rest_number - $found_number);
$temp_array[] = $found_number;
}
return $temp_array;
}
$number_array_recursive = array();
$number_array_recursive = get_numbers($number);
Тем не менее, использование что-то вроде pow (floor (log ())) * кажется слишком большим для такой простой проблемы, как эта.
Мне кажется, что проблема требует рекурсивного решения с некоторыми очень простыми математическими вычислениями, но я просто не вижу этого.
Любая помощь будет оценена.
Редактировать: Бинарный ключ, большое спасибо всем!