我有一个生成一系列数字的算法。参数为$min
,$range
。如果我给出值:
$min = 4
$range = 1
算法生成数字,可以在最小范围内分组。比方说,对于上述输入,算法会生成从$min
,$min + $range
开始的数字,乘以增量:
Iteration n: range($min x n to ($min + 1) x n)
Iteration 1: 4, 5 // range (4, 5)
Iteration 2: 8, 9, 10 // range (8, 10)
Iteration 3: 12, 13, 14, 15 // range (12, 15)
// and so on!
因此,如果我将输入数字设为13
,我们可以理解它可以通过任何方式获得:
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
2 + 2 + 2 + 2 + 2 + 2 + 1
3 + 3 + 3 + 3 + 1
4 + 4 + 4 + 1
5 + 5 + 3
6 + 6 + 1
7 + 6
8 + 5
等等。但根据输入,我们的数字仅在4
和5
范围内。所以,我应该得到答案:
4 + 4 + 5
如果我按照上面的方法,从较大的数字开始,它将迭代:
5 + 5 + 3 // 3 is Invalid
4 + 4 + 4 + 1 // 1 is Invalid
如何使算法理解常见匹配或类似最高公因子或最大公共分频器概念,我们只需得到以下结果:
4 + 4 + 5
我坚持这个,如何继续。上面的解释是算法的实现,但我不知道如何实现它。
我的尝试之一是,混合使用所有数字并尝试标记每一位。因此,在第一次尝试时,我使用最小的数字来匹配它:
4 + 4 + 4
正如,4 + 4 + 4 + 4
超过13
。现在,我正在接下一个人:
5 + 5 + 5
保持两组输入,我逐一减少数字:
Try 0: 5 + 5 + 5 // Larger
Try 1: 5 + 5 + 4 // Larger
Try 2: 5 + 4 + 4 // Success
目前的实施是:
function getNums($k, $range, $num)
{
$q = floor($num / $k);
$r = $num % $k;
echo str_repeat($q . ", ", $k - $r), str_repeat(($q+1) . ", ", $r);
}
输出很奇怪:
getNums(4, 1, 13); // 3, 3, 3, 4 // Expecting 4, 4, 5
getNums(4, 1, 18); // 4, 4, 5, 5
答案 0 :(得分:1)
尽可能均匀地n
分割k
方式:计算q = n / k
和r = n % k
(分区/模数)。返回k
- 元素列表,其中包含k - r
和q
r
份q + 1
份的q
份副本。 q + 1
和function getNums($q, $range, $num)
{
$k = floor($num / $q);
$r = $num % $q;
echo str_repeat($q . ", ", $k - $r), str_repeat(($q+1) . ", ", $r);
}
(如果使用)都在范围内。
{{1}}