admin 发表于 2020-7-15 23:17:14

PHP最优整数均分算法

<?php
/*
* @最优整数均分算法
* @param int $number 待平分的数字
* @param int $taotl 平分总个数
*/
function getDivideNumber($number, $total) {
    $divide_number= bcdiv($number, $total);    // 除法取平均数
    $last_number = bcsub($number, $divide_number * $total);    // 获取剩余
    $number_str = str_repeat($divide_number.'|', $total - $last_number);    // 拼装平分后的数据
    $number_str2 = str_repeat(($divide_number + 1).'|', $last_number);    // 拼装剩下的分配
    $number_str = $number_str2 . $number_str;    // 组合
    return explode('|', trim($number_str, '|')); // 去掉前后多余的分隔符 返回数组
}
$arr = getDivideNumber(20, 8);
print_r($arr);


算法实现2:
/**
* 将一个数值切成N份
* @paramint $number    切的数值
* @paramint $avgNumber 份数
* @return array
*/
function numberAvg($number, $avgNumber)
{
      if($number == 0) {
                $array = array_fill(0, $avgNumber, 0);
      } else {
                $avg   = floor($number / $avgNumber);
                $ceilSum = $avg * $avgNumber;
                $array   = [];
                for($i = 0; $i < $avgNumber; $i++) {
                        if($i < $number - $ceilSum) {
                              array_push($array, $avg + 1);
                        } else {
                              array_push($array, $avg);
                        }
                }
      }
      return $array;
}

print_r(numberAvg(20, 8));
以上代码执行结果为:Array
(
    => 3
    => 3
    => 3
    => 3
    => 2
    => 2
    => 2
    => 2
)
PHP实现最近似的分配法
页: [1]
查看完整版本: PHP最优整数均分算法