(考点: 逻辑, 循环, 随机函数应用, 任务拆分)
己知一个数字num, 将其拆分成$n个"随机"数字, 使其相加之和等于$num, 并且满足每个数字最大值不能大于$max, 最小值不能小于$min, 请完成下面函数.
例:  split_num(20, 4, 8, 1) //返回 array(0 => 6, 1 => 5, 2 => 3, 3 => 6)
split_num(20, 4, 8, 1)
这里面 
20是要求出来的四个数字的和
4 是四个随机数
8 是数字里的$max
1 是数字里的$min求这个函数的写法
function split_num($num, $n, $max, $min) {
    
}print_r(split_num(20, 4, 8, 1));

解决方案 »

  1.   

    本帖最后由 xuzuning 于 2012-03-18 12:42:35 编辑
      

  2.   

    [[email protected] csdn]$ cat split_num.php 
    <?php
    function split_num($sum, $num, $max, $min) {
            srand(time());
            $res = array();        if ($min * $num > $sum) {
                    return null;
            } else if ($min * $num == $sum) {
                    for ($i = 0; $i < $num; ++ $i) {
                            $res[] = $min;
                    }
                    return $res;
            }        $left = $sum;        for ($i = 0; $i != $num; ++ $i) {
                    $cur_max = $left - ($num - $i - 1) * $min;
                    $rd_num = rand($min, $cur_max);
                    $res[] = $rd_num;
                    $left -= $rd_num;
            }        $res[$num - 1] += $left;
            return $res;
    }$res = split_num(20, 4, 8, 1);
    print_r($res);
    ?>
    [[email protected] csdn]$ php split_num.php 
    Array
    (
        [0] => 11
        [1] => 7
        [2] => 1
        [3] => 1
    )
    [[email protected] csdn]$ 新手纯属路过。
      

  3.   

    出现了Array
    (
        [0] => 3
        [1] => 13
        [2] => 1
        [3] => 3
    )
      

  4.   


    额,懂了,少max判断了。。
      

  5.   

    其实不该设定min
    因为用户调用不当,就会出问题:(
      

  6.   

    <?php
    function split_num($sum, $num, $max, $min) {
            srand(time());
            $res = array();        if ($min * $num > $sum) {
                    return null;
            } else if ($min * $num == $sum) {
                    for ($i = 0; $i < $num; ++ $i) {
                            $res[] = $min;
                    }
                    return $res;
            }        $left = $sum;        for ($i = 0; $i != $num; ++ $i) {
                    $cur_max = $left - ($num - $i - 1) * $min;
                    $cur_max = $cur_max < $max ? $cur_max : $max;
                    $cur_min = $left - ($num - $i - 1) * $max;
                    $cur_min = $cur_min < $min ? $min : $cur_min;
                    echo("[" . $cur_min . "," . $cur_max ."]");
                    $rd_num = rand($cur_min, $cur_max);
                    $res[] = $rd_num;
                    $left -= $rd_num;
            }        $res[$num - 1] += $left;
            return $res;
    }$res = split_num(20, 4, 8, 1);
    print_r($res);
    ?>
      

  7.   

    再来一个,面试应该这个好function split_num($sum, $num, $max, $min) {
      $res = array_fill(0, $num-1, $min);
      while(array_sum($res) < $sum) {
        $k = rand(0, $num-1);
        if($res[$k] < $max) $res[$k]++;
      }
      return $res;
    }