n 個の数値の合計は 32898 であることが知られており、それぞれの加数を求めます

WBOY
リリース: 2016-06-23 13:27:55
オリジナル
926 人が閲覧しました

n 個の数値の合計は 32898 または他の整数であることが知られています。
各加数を求め、結果はランダムである必要があります。
加数は 1 (両端を含む) から 999 (両端を含む) までの整数です
つまり $arr[1]+$arr[2]+....+$arr[n]=32898

は次のようにする必要がありますこれら 33 個の加数を見つけるには、これら 33 個の加数の配列を返す必要があります。結果はランダムである必要があります。

私の実際のアプリケーションでは、各加数は 1 ~ 999 でなければなりません。専門家はこの範囲に従ってテストする必要があります。

function xxx(32898,33,1,999){    $arr = array();     return $arr;}
ログイン後にコピー


ディスカッション (解決策) への返信

加数は繰り返すことができますか?

1 から 99 までの 33 個の数字は 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 個の数値であれば、答えは完全に正しいです。現在の状況の代わりに 53 個の数値を出力します。ありがとう。
20 ポイントが追加されました、ありがとうございます

$r = foo(32898, 33);

$r はご希望の結果です。検証を行いました。それをどうするかはあなた自身の仕事です
$r は配列であり、print_r($r) は内容を表示します

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート