以前の記事にPHPでの整数分割アルゴリズムを解説したものがありました. 整数分割アルゴリズム
しかし,このコードでは小数以下の取扱がfloor挙動により負の値だと正しく動きません. floorとceilについて
このコードを負の数についても挙動するように改正したコードを以下に示します.
function partition($dividend, $n){ // 整数分割アルゴリズム if(empty($dividend)) { return array_fill(0, $n, 0.0); } $sign = $dividend / abs($dividend); $base = $sign * floor(abs($dividend / $n)); // 最低の配当 $rem = abs($dividend % $n); // あまり $list = []; for($i = 0; $i < $n; $i ++){ $list[] = ($i < $rem) ? $base + $sign : $base; } return $list; }
これで負の数に対しても整数分割できるアルゴリズムになったと思います. 基本的には以前と同様の処理を絶対値について行った後に符号をかける形になっています. 符号によってceilとfloorをスイッチする方針でもいいかもしれません.