Программа составления вектора из фиксированного набора чисел - Turbo Pascal
Формулировка задачи:
Прошу помощи или подсказки в написании программы, которая бы из 2000 (фиксированно) чисел от 1 до 20 (возможен и другой близкий диапазон значений) составляла бы вектор, сумма всех элементов которого равнялась бы 40000 (fixed).
Пишу программу на матлабе, но задача больше для программистов, поэтому и обращаюсь сюда.
В идеале числа должны выбираться случайно из набора 1-20 или любого другого, как я описал выше. Но я могу их потом случайным образом и перемешать. Главное алгоритм. У меня никак не сходится по параметрам: кол-во чисел в векторе (2000) и сумма всех элементов (40000), которые жестко зафиксированы.
Решение задачи: «Программа составления вектора из фиксированного набора чисел»
textual
Листинг программы
- {$MODE TP}
- function RandomInRange(const a, b: Integer): Integer;
- begin
- RandomInRange := Random(b - a + 1) + a;
- end;
- var
- randId, i, n: Word;
- sum, reqSum: LongInt;
- temp: Integer;
- ar: Array[Word] Of Integer;
- a, b: Byte; //диапазон значений
- begin
- Randomize;
- repeat
- Write('Input array length: ');
- ReadLn(n);
- until (n > 0);
- Write('Input sum: '); ReadLn(reqSum);
- Write('Input left boundary: '); ReadLn(a);
- repeat
- Write('Input right boundary (>=', a, '): ');
- ReadLn(b);
- until (b >= a);
- //начальное генерирование
- sum := 0;
- for i := 0 to n - 1 do
- begin
- ar[i] := RandomInRange(a, b);
- Inc(sum, ar[i]);
- end;
- //зацикливаемся пока не выйдем на нужную сумму
- while (sum <> reqSum) do
- begin
- repeat
- randId := RandomInRange(0, n - 1);
- until (((sum > reqSum) And (ar[randId] > a)) Or ((sum < reqSum) And (ar[randId] < b))); //рандомно выбираем элемент попутно делая проверку есть ли смысл менять текущий элемент (к примеру, при недоборе суммы нет смысла менять максимальный элемент)
- temp := ar[randId];
- if (sum > reqSum)
- then //если перебор
- ar[randId] := RandomInRange(a, ar[randId] - 1) //уменьшаем в пределах left <= x < current
- else //если недобор
- ar[randId] := RandomInRange(ar[randId] + 1, b); //увеличиваем в пределах current < x <= right
- sum := sum - temp + ar[randId]; //пересчитываем сумму
- end;
- //вывод окончательного массива
- Write('Generated array:');
- for i := 0 to n - 1 do
- Write(' ', ar[i]);
- end.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д