Показать сообщение отдельно
  #10 (permalink)  
Старый 28.07.2012, 23:17
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Прикольная задачка. Предыдущие ответы не читал, ибо лень.

// предполагается, что все аргументы - целые неотрицательные числа
function SplitNum (sum, summands, min) {

  if (summands < 1 || summands * min > sum) {
    return []; // если операцию выполнить невозможно, возвращаем пустой массив
  }

  var i;
  var range = sum - summands * min; // сумма слагаемых после вычета минимумов
  var points = []; // здесь будут точки деления диапазона [0; range]

  for (i=0; i<summands-1; i++) { // произвольных точек деления на 1 меньше, чем слагаемых

    // генерируем псевдослучайное целое число в диапазоне [0; range]
    points[i] = Math.floor(Math.random() * (range + 1));
  }

  points.push(0, range); // добавляем стартовую и конечную точки деления
  points.sort(function (a, b) { return a - b; }); // сортируем по возрастанию

  var result = []; // сюда будем сгребать слагаемые

  for (i=0; i<summands; i++) {

    // слагаемое вычисляем по разнице между точками деления с добавлением минимума
    result[i] = points[i+1] - points[i] + min;
  }

  return result; // возвращаем массив слагаемых
}

var text = "";

text += SplitNum(130, 3, 20) + "\n";
text += SplitNum(130, 3, 0) + "\n";
text += SplitNum(130, 1, 20) + "\n";
text += SplitNum(100, 10, 10) + "\n";
text += SplitNum(100, 4, 24) + "\n";
text += SplitNum(100500, 10, 10000);

alert(text);


UPD: oneguy опередил меня, потому что комменты зажопил.)) Хотя наши решения немножко отличаются.
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 28.07.2012 в 23:30.
Ответить с цитированием