Я работаю над математической задачей, где формула: A [i] * (-2) степень i
где i=0,1,2,3,...
A является массивом, имеющим значения 0 или 1
Входной массив: [0,1,1,0,0,1,0,1,1,1,0,1,0,1,1]
Выход: 5730
Код
$totalA = 0;
foreach ($A as $i => $a) {
$totalA += $a * pow(-2, $i);
}
Это правильно. Теперь я ищу его противоположность, как:
Ввод: 5730
Выход будет: [0,1,1,0,0,1,0,1,1,1,0,1,0,1,1]
Я не спрашиваю точный код, но ищу логику, с которой я должен начать. Я пытался использовать метод log (), но это не вернул желаемый результат.
Вы не искали точный код, но я нашел эту проблему слишком интересной. Это работает:
function sign($n) {
return ($n > 0) - ($n < 0);
}
$target = -2396;
$i = 0;
$currentSum = 0;
// Look for max $i
while (true) {
$val = pow(-2, $i);
$candidate = $currentSum + $val;
if (abs($target) <= abs($candidate)) {
// Found max $i
break;
}
if (abs($target - $candidate) < abs($target - $currentSum)) {
// We are getting closer
$currentSum = $candidate;
}
$i++;
}
$result = [];
for ($j = $i; 0 <= $j; $j--) {
$val = pow(-2, $j);
$border = $val / 4;
if (sign($val) == sign($target) && abs($border) < abs($target)) {
array_unshift($result, 1);
$target -= $val;
} else {
array_unshift($result, 0);
}
}
echo json_encode($result);
Сначала я ищу $i
что заставляет меня или чуть выше $target
, Когда найден, я спускаюсь и решаю для каждого бита, должен ли он быть в результате.
Других решений пока нет …