在PHP中寻找pow()的反面

时间:2017-02-09 09:04:48

标签: php math linear-algebra

我正在研究数学问题,其公式为: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()方法,但没有返回所需的输出。

1 个答案:

答案 0 :(得分:1)

你没有找到确切的代码,但我发现这个问题太有趣了。这有效:

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的{​​{1}}。找到后,我走下去,决定每一位是否应该在结果中。