これはプログラミングに関する質問で、ある程度考える必要があり、どのプログラミング言語にも当てはまります。
次の配列があるとします。
$arr=array(10,7,4,4,3,2,1,1,1,1,1,1);
この配列は動的で、任意の数値のセットにすることができます。
乗数もあります0.6
。
目標は、合計 * 乗数にできるだけ近くなるように、各数値を 1 つずつ表示することです。この場合、数値は 36 に加算され、*0.6 は 21.6 になります。
キャッチは次のとおりです。
- 各値 (整数のみ) を四捨五入する必要があるため、実際の目標は、数値の合計をできるだけ 22 に近づけることです。
- 関数を使用して配列の合計を解くことはできません。ループできるのは 1 回だけです。
最も基本的な試みは
$multiplier = 0.6;
$sum=0;
foreach($arr AS $value){
$sum+=round($multiplier * $value);
}
ただし、1*0.6 は常に 1 に丸められるため、これは機能しません。
次のようなもので可能だと思います:
$multiplier = 0.6;
$sum=0;
foreach($arr AS $value){
$real=$multiplier * $value;
$rounded=round($multiplier * $value);
$sum_rounded += $rounded;
$sum_real += $real;
//Somehow compare the two sums and break the foreach
}
ここからどこへ行けばいいのかわからない。皆さんはどう思いますか?
これを試しました:
$sum_real=0;
$sum_round=0;
$count=0;
foreach($rows AS $arr){
$count+=1;
$real_val=$arr*$multiplier;
$sum_round+=round($real_val);
$sum_real+=$real_val;
$avg_round=$sum_round/$count;
$avg_real = $sum_real/$count;
$val = ($avg_round>$avg_real) ? floor($real_val) : round($real_val);
}
しかし、うまくいきませんでした...でも、近づいていると思います。