我正在研究数学问题,其公式为: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()方法,但没有返回所需的输出。
答案 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}}。找到后,我走下去,决定每一位是否应该在结果中。