Программа составления вектора из фиксированного набора чисел - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Прошу помощи или подсказки в написании программы, которая бы из 2000 (фиксированно) чисел от 1 до 20 (возможен и другой близкий диапазон значений) составляла бы вектор, сумма всех элементов которого равнялась бы 40000 (fixed). Пишу программу на матлабе, но задача больше для программистов, поэтому и обращаюсь сюда. В идеале числа должны выбираться случайно из набора 1-20 или любого другого, как я описал выше. Но я могу их потом случайным образом и перемешать. Главное алгоритм. У меня никак не сходится по параметрам: кол-во чисел в векторе (2000) и сумма всех элементов (40000), которые жестко зафиксированы.

Решение задачи: «Программа составления вектора из фиксированного набора чисел»

textual
Листинг программы
  1. {$MODE TP}
  2. function RandomInRange(const a, b: Integer): Integer;
  3. begin
  4.     RandomInRange := Random(b - a + 1) + a;
  5. end;
  6.  
  7. var
  8.     randId, i, n: Word;
  9.     sum, reqSum: LongInt;
  10.     temp: Integer;
  11.     ar: Array[Word] Of Integer;
  12.     a, b: Byte; //диапазон значений
  13. begin
  14.     Randomize;
  15.     repeat
  16.         Write('Input array length: ');
  17.         ReadLn(n);
  18.     until (n > 0);
  19.     Write('Input sum: '); ReadLn(reqSum);
  20.     Write('Input left boundary: '); ReadLn(a);
  21.     repeat
  22.         Write('Input right boundary (>=', a, '): ');
  23.         ReadLn(b);
  24.     until (b >= a);
  25.     //начальное генерирование
  26.     sum := 0;
  27.     for i := 0 to n - 1 do
  28.     begin
  29.         ar[i] := RandomInRange(a, b);
  30.         Inc(sum, ar[i]);
  31.     end;
  32.     //зацикливаемся пока не выйдем на нужную сумму
  33.     while (sum <> reqSum) do
  34.     begin
  35.         repeat
  36.             randId := RandomInRange(0, n - 1);
  37.         until (((sum > reqSum) And (ar[randId] > a)) Or ((sum < reqSum) And (ar[randId] < b))); //рандомно выбираем элемент попутно делая проверку есть ли смысл менять текущий элемент (к примеру, при недоборе суммы нет смысла менять максимальный элемент)
  38.         temp := ar[randId];
  39.         if (sum > reqSum)
  40.         then //если перебор
  41.             ar[randId] := RandomInRange(a, ar[randId] - 1) //уменьшаем в пределах left <= x < current
  42.         else //если недобор
  43.             ar[randId] := RandomInRange(ar[randId] + 1, b); //увеличиваем в пределах current < x <= right
  44.         sum := sum - temp + ar[randId]; //пересчитываем сумму
  45.     end;
  46.     //вывод окончательного массива
  47.     Write('Generated array:');
  48.     for i := 0 to n - 1 do
  49.         Write(' ', ar[i]);
  50. end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы