提问人:Giedrius 提问时间:6/17/2023 最后编辑:Rohit GuptaGiedrius 更新时间:6/27/2023 访问量:67
PHP - 通过分布整数进行安全除法
PHP - Safe division by distributing whole numbers
问:
PHP 中是否有数学函数可以提供没有分数/十进制数的安全除法?这意味着它将尽可能平均地“分配”金额,但只能以整数形式分配。
一些例子:
10/3 = [4, 3, 3]
11/3 = [4, 4, 3]
50/2 = [25, 25]
51/2 = [26, 25]
40/5 = [8, 8, 8, 8, 8]
40/3 = [14, 13, 13]
这意味着应该给我三个值,并且40/3
14
13
13
答:
-2赞
Koala Yeung
6/17/2023
#1
没有缺货的东西。您可以为它编写自己的函数。
function sdiv(int $dividend, int $divisor): array {
$q = (int) floor($dividend / $divisor);
$r = $dividend % $divisor;
return array_merge(
array_fill(0, $r, $q + 1),
array_fill(0, $divisor - $r, $q),
);
}
assert(sdiv(10, 3) === [4, 3, 3]);
assert(sdiv(11, 3) === [4, 4, 3]);
assert(sdiv(15, 4) === [4, 4, 4, 3]);
assert(sdiv(16, 4) === [4, 4, 4, 4]);
assert(sdiv(17, 4) === [5, 4, 4, 4]);
assert(sdiv(18, 4) === [5, 5, 4, 4]);
运行它,所有断言都应该通过。php -d zend.assertions=1 filename.php
评论
2赞
Rohit Gupta
6/21/2023
当有四个答案时,这将不起作用。如果您想要我的投票,请修复
0赞
Koala Yeung
6/27/2023
原来的帖子非常不清楚“安全划分”是什么意思。我的旧答案符合当时演示的输入和输出。我已经更新了我的答案以适应更新的问题。
1赞
kikon
6/22/2023
#2
由于目前还没有可行的解决方案,这里有一个:
这个问题似乎要求将一个整数拆分(分区)为一组数字,这些数字要么是 ,要么是 由于 ,拆分可以通过以下公式生成:s
n
q1 = ceil(s/n)
q2 = floor(s/n)
q1 - q2 = 1
q1 * (s - q2 * n) + q2 * (q1 * n - s) = (q1 - q2) * s = s,
那是
s = n1 * q1 + n2 * q2,
使用 、 和n1 = s - q2 * n
n2 = q1 * n - s
n1 + n2 = (q1 - q2) * n = n
Php 函数:
function splitInt($s, $n) {
$q = $s / $n;
$q1 = ceil($q);
$q2 = floor($q);
$n1 = $q1 * $n - $s;
// the result is [$n1 x q1, ($n - $n1) x $q2]
return array_pad(array_fill(0, $n1, $q1), $n, $q2);
}
例:
$res = splitInt(100, 7);
echo json_encode($res) . "\n";
$sum = array_sum($res);
$count = count($res);
echo "count = $count sum = $sum\n\n";
给
[15,15,14,14,14,14,14]
count = 7 sum = 100
沙盒中的更多示例。
上一个:包裹机箱中包裹拟合算法
评论