Home >Backend Development >PHP Tutorial >已知n个数的和是32898,求每一个加数

已知n个数的和是32898,求每一个加数

WBOY
WBOYOriginal
2016-06-23 13:27:55940browse

已知n个数的和是32898,或是其他的整数,
求每个加数,要求结果随机。
加数是在1(含)到999(含)之间的整数
也就是说$arr[1]+$arr[2]+....+$arr[n]=32898

必须下面的33个加数 加起来是32898,求这33个加数,要求返回这33个加数的一个数组。要求结果随机。

我的实际应用中每个加数必须是在1到999之前,请高手一定要按照这个区间进行测试。

function xxx(32898,33,1,999){    $arr = array();     return $arr;}


回复讨论(解决方案)

加数可以重复吗?

33个1~99的数组成32898
平均数是997
所以取值范围是995~999
取1是不可能的。

$r = foo(32898, 33);echo array_sum($r), PHP_EOL; //验证总和print_r(array_count_values($r)); //查看分布function foo($num, $k, $min=1, $max=999) {  $res = array_fill(0, $k, 1);  do {    for($i=0; $i<$k; $i++) {      $sum = array_sum($res);      $t = rand(0, $max - $min);      if($res[$i] + $t > $max) $t = $max - $res[$i];      if($sum + $t > $num) $t = $num - $sum;      $res[$i] += $t;    }  }while($num > $sum);  return $res;}
一个可能的结果
32898Array(    [999] => 31    [971] => 1    [958] => 1)

加数可以重复吗?



加数可以重复。但是如果尽量不重复更好一点点。

$r = foo(32898, 33);echo array_sum($r), PHP_EOL; //验证总和print_r(array_count_values($r)); //查看分布function foo($num, $k, $min=1, $max=999) {  $res = array_fill(0, $k, 1);  do {    for($i=0; $i<$k; $i++) {      $sum = array_sum($res);      $t = rand(0, $max - $min);      if($res[$i] + $t > $max) $t = $max - $res[$i];      if($sum + $t > $num) $t = $num - $sum;      $res[$i] += $t;    }  }while($num > $sum);  return $res;}
一个可能的结果
32898Array(    [999] => 31    [971] => 1    [958] => 1)



$r = foo(32898, 33);echo array_sum($r), PHP_EOL; //验证总和print_r(array_count_values($r)); //查看分布function foo($num, $k, $min=1, $max=999) {  $res = array_fill(0, $k, 1);  do {    for($i=0; $i<$k; $i++) {      $sum = array_sum($res);      $t = rand(0, $max - $min);      if($res[$i] + $t > $max) $t = $max - $res[$i];      if($sum + $t > $num) $t = $num - $sum;      $res[$i] += $t;    }  }while($num > $sum);  return $res;}
一个可能的结果
32898Array(    [999] => 31    [971] => 1    [958] => 1)



经过我测试53个数,答案完全正确,如果是33个数能否输出33个数的数字,如果是53个数,输出53个数的数字,而不是现在这样。谢谢。

已追加20分,多谢

$r = foo(32898, 33);
$r 就是你要的结果,我只是做了下验证。你要拿他做什么,就是你自己的事情了
$r 是数组,print_r($r) 就看到内容了

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn