【发布时间】:2021-02-09 02:02:46
【问题描述】:
我有一个问题如下:
给定一个正整数 n,返回一个严格递增的数字序列(列表/数组/字符串,取决于语言),使得平方和等于 n²。
decompose(11) 必须返回 [1,2,4,10]。请注意,实际上有两种方法可以分解 11²,11² = 121 = 1 + 4 + 16 + 100 = 1² + 2² + 4² + 10² 但不返回 [2,6,9],因为 9 小于 10 (如果可以使用多个平方整数序列,则使用最大的一个 - 所以在上述情况下是 10 而不是 9)。
对于 decompose(50) 不要返回 [1, 1, 4, 9, 49] 而是 [1, 3, 5, 8, 49] 因为 [1, 1, 4, 9, 49] 不是严格递增的序列。
我无处可去,尝试这个(可能做得不好):
function sq2squares($n) {
$starting = ($n - 1) ** 2;
$square = $n**2;
$range = range(1, $n -1);
$start = $square - $starting;
foreach($range as $r => $v) {
if($v**2 > $start) {
unset($range[$r]);
}
}
# $range here is [1, 2, 3, 4, 5, 6, 7, 8, 9];
foreach(array_reverse($range) as $r) {
if($r**2 < $start) {
$start -= $r**2;
}
}
print_r($results); // [49] || Should be: [1,3,5,8,49]
}
我已经从最大的下一个数字 (49) 中减去输入的平方,剩下 99。然后我想迭代 $range (9-1) 中的剩余整数并减去每个整数,但前提是所得的减法结果为 @ 987654324@ 为 0。最后一部分是我无法弄清楚的。
如何遍历数组$range 并且只有array_push() 值导致$start 为0?谢谢。
【问题讨论】:
-
since 9 is smaller than 10这没有意义。 -
这意味着如果有多个整数的平方和等于输入,则选择最大的整数。那有意义吗?谢谢。
-
虽然我并不太关心那部分,但我不太明白如何从
$range中减去剩余的整数,以便最终的减法将$start设置为0?然后将这些元素推入包含 49 的数组中。 -
这和subset sum problem非常相似
-
@nice_dev:是的,我对任何其他方法持开放态度。我只是在努力学习。谢谢!