разбить число на n слагаемых

Статус
В этой теме нельзя размещать новые ответы.

caspersky

Создатель
Регистрация
7 Июл 2008
Сообщения
18
Реакции
0
ТЗ - разбить к примеру число 1200 на 4 слагаемых =
300+400+350+150.
нужен алгоритм на PHP.
 
По какому критерию разбивать? Всегда ли на 4-е слогаемых, и они всегда должны быть кратными 50? ТЗ непонятное :)
 
Разбить на любые слагаемые? 0 является слагаемым?
 
ТЗ не полное.
на какие части нужно делить?
1200 можно поделить и на 400 + 400 + 400 ...
в общих чертах алгоритм с рекурсией - в цикле дели число напополам +- какойто random коэфициент... потом его-же в рекурсии опять дели столько раз сколько надо - результаты в массив, а потом на экран.
 
  • Заблокирован
  • #5
Алгоритм не зависит от того PHP это или не PHP.
Алгоритм он и в Африке алгоритм... :)
А так, что то вроде:
Нужно разбить число Z на N слагаемых.
1. Проверяем, не меньше ли Z чем N иначе столько, сколько нужно слагаемых не получить.
2. В цикле вычитаем из Z (N-i) и еще единичку (это чтобы числа на всех хватило). Получаем случайное целое число в диапазоне от 0 (зы: от единицы конечно же!) до (Z - (N-i) - 1), вычитаем его из Z, и так, пока шаги не кончатся...
Ну или что-то наподобие...
 
black.cat, Zander, спс, что и требовалось!
 
Разбить число на 2 слагаемых:

1) Берем случайное число от 1 до n-1 (или от 0 до n, если нулевое слагаемое тоже подходит)
2) Вычитаем полученное на шаге 1) число из исходного n.

Все :)
Дальше ты любое из этих чисел бьешь еще на 2, сколько нужно раз.

PHP:
function split2($n) {
  $m = rand(1,$n-1);
  return array($m, $n-$m);
}

$n = 1000; // число которое надо разбить
$o = array($n);  // выходной массив (output)
for($i=0; $i<3; $i++) { // в цикле 3 раза
  shuffle($o);
  $k = array_shift($o); // выбираем произвольный эл-т
  $o = array_merge($o,split2($k)); // и вставляем вместо него 2
}
var_dump($o);
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху