Подразделы

Другие разделы

Дата и время

29/03/2024 18:38:52

Авторизация

Имя:
Пароль:
Зарегистрироваться
Восстановить пароль
 

printРазбор задач

print1. Превращение

Самая простая задача. Необходимо правильно указать тип переменной `N` (longint) и точно выполнять указанные в задаче шаги, пока значение `N` не станет равным 1, а затем вывести количество выполненных шагов.

print2. Разложение на простые слагаемые

Самая сложная задача. 15 баллов можно было получить с помощью рекурсивного перебора. Полное решение требует одновременно применения "длинной" арифметики (только сложение), динамического программирования и алгоритма для проверки числа на простоту. Самый сложный элемент – динамическое программирование. Количество разложений данного числа `N` на простые слагаемые является суммой по всем простым числам `P\ ≤\ N` количеств разложений числа `(N–P)` на простые слагаемые меньшие или равные `P`. Для `N\ =\ 0` существует 1 (пустое) разложение. При правильной организации вычислений необходим только один массив, в котором постепенно будет накапливаться количество разложений числа `I` на простые слагаемые меньшие и равные `P`.

print3. Анаграммы

Решение требует применения математических знаний. Необходимо либо вспомнить, либо вывести формулу из комбинаторики для перестановок с повторениями – `N!/(K_1!*K_2!*…*K_M!)`. Если у нас `N` различных предметов, то существует `N!` их различных перестановок. Если `Q` некоторых предметов неразличимы, то число перестановок уменьшается в `Q!` раз.
Для 14 букв максимальное число различных перестановок равно `14!=87\ 178\ 291\ 200`. Это число больше `2*10^9` (`2^31`), следовательно, для результата необходима переменная типа extended.

print4. Калькулятор

Простая "техническая" задача. Возможно решение с использованием case и одновременным формированием 3 строк. Использование подпрограммы существенно упрощает программу, так как для всех трех выводимых строк должны быть выполнены одни и те же действия.
var s:string;
procedure display(const s,v:string);
var i,k:integer;
begin
  for i:=1 to length(s) do
  begin
    if s[i]='-' then k:=1
    else k:=(ord(s[i])-ord('0'))*3+4;
    if (k>0) and (k<length(v)) then
      write(copy(v,k,3));
  end;
  writeln;
end;
begin
  readln(s);
  display(s,'    _     _  _     _  _  _  _  _ ');
  display(s,' _ | |  | _| _||_||_ |_   ||_||_|');
  display(s,'   |_|  ||_  _|  | _||_|  ||_| _|');
end.
loading