我试图以一种方式将数字分解为数组(在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())之类的东西似乎对于像这样的简单问题有点多.
在我看来,问题需要一个非常简单的数学递归解决方案,但我只是没有看到它.
任何帮助都会被贬低.
编辑:二进制是关键,非常感谢!
你可以得到数字的二进制表示 - 1表示包括2的幂,零表示不
即
$binary_number = decbin($test_number); $binary_string = "${binary_number}"; for ($i = 0; $i < strlen($binary_string); $i++) { if ($binary_string[strlen($binary_string) - $i - 1] == "1") { $num_out = pow(2, $i); print "${num_out} "; } }
这已经过测试并且可以正常运行但是在PHP中可能有更好的语法分析方法.