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

Тема в разделе "PHP", создана пользователем caspersky, 23 июн 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. caspersky

    caspersky Создатель

    Регистр.:
    7 июл 2008
    Сообщения:
    18
    Симпатии:
    0
    ТЗ - разбить к примеру число 1200 на 4 слагаемых =
    300+400+350+150.
    нужен алгоритм на PHP.
     
  2. semakos

    semakos Постоялец

    Регистр.:
    26 окт 2008
    Сообщения:
    63
    Симпатии:
    14
    По какому критерию разбивать? Всегда ли на 4-е слогаемых, и они всегда должны быть кратными 50? ТЗ непонятное :)
     
  3. ПроФ

    ПроФ Создатель

    Регистр.:
    5 июн 2009
    Сообщения:
    25
    Симпатии:
    6
    Разбить на любые слагаемые? 0 является слагаемым?
     
  4. black.cat

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    ТЗ не полное.
    на какие части нужно делить?
    1200 можно поделить и на 400 + 400 + 400 ...
    в общих чертах алгоритм с рекурсией - в цикле дели число напополам +- какойто random коэфициент... потом его-же в рекурсии опять дели столько раз сколько надо - результаты в массив, а потом на экран.
     
    caspersky нравится это.
  5. Zander

    Zander Читатель

    Заблокирован
    Регистр.:
    6 авг 2007
    Сообщения:
    194
    Симпатии:
    36
    Алгоритм не зависит от того PHP это или не PHP.
    Алгоритм он и в Африке алгоритм... :)
    А так, что то вроде:
    Нужно разбить число Z на N слагаемых.
    1. Проверяем, не меньше ли Z чем N иначе столько, сколько нужно слагаемых не получить.
    2. В цикле вычитаем из Z (N-i) и еще единичку (это чтобы числа на всех хватило). Получаем случайное целое число в диапазоне от 0 (зы: от единицы конечно же!) до (Z - (N-i) - 1), вычитаем его из Z, и так, пока шаги не кончатся...
    Ну или что-то наподобие...
     
    waldicom и caspersky нравится это.
  6. caspersky

    caspersky Создатель

    Регистр.:
    7 июл 2008
    Сообщения:
    18
    Симпатии:
    0
    black.cat, Zander, спс, что и требовалось!
     
  7. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Разбить число на 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);
     
Статус темы:
Закрыта.