我有一个生成一系列数字的算法。参数为$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
如何让算法理解公共(public)匹配或类似最高公因数或最大公约数的概念,我们只需要得到以下结果:
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
更新 #1
当前的实现是:
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
最佳答案
尽可能均匀地拆分 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);
}
关于php - 将数字分成数字组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490614/