Все задачи курса
Схема вычисления инвариантной функции
При решении задач из этого раздела необходимо указать
множества ,
и
, функцию
и преобразование
(см. определение инвариантной функции).
Должна быть объяснена программная реализация преобразования
и
доказана правильность построенной программы вида "S0;while(e)S;S1;".
Задача 11.25. Напишите программу, находящую наибольший общий делитель
двух целых неотрицательных чисел
и
, не равных одновременно нулю.
Воспользуйтесь следующими свойствами наибольшего общего делителя
(не забудьте научиться доказывать все
эти свойства):
,
,
,
,
.
Задача 11.26. Напишите программу, перемножающую два целых числа, одно из
которых неотрицательно, без использования операции умножения. Точные
пред- и постусловия требуемой программы, временная
сложность которой не должна превосходить , таковы:
,
. При написании программы величины
и
изменять не
разрешается. Воспользуйтесь тем, что
функция
,
является инвариантной
относительно преобразования
, задаваемого
формулой

Задача 11.27. Напишите программу, находящую наибольший общий делитель
двух целых неотрицательных чисел
и
, не равных одновременно нулю.
Воспользуйтесь следующим свойством наибольшего общего
делителя (докажите его!):

Здесь операция позволяет найти остаток от деления
на
.
Задача 11.28. Напишите программу, возводящую целое число в целую
неотрицательную степень. Точные
пред- и постусловия требуемой программы таковы: ,
.
При написании программы величины
и
изменять не
разрешается. Воспользуйтесь тем, что
функция
,
является инвариантной
относительно преобразования
, задаваемого
формулой
.
Задача 11.29. Напишите программу, находящую наибольший общий делитель
двух целых неотрицательных чисел
и
, не равных одновременно нулю.
Программа должна иметь временную сложность порядка
и не использовать операций деления и нахождения остатка от деления
(допустимо деление пополам, реализуемое с помощью операции сдвига).
Воспользуйтесь следующими свойствами наибольшего общего
делителя (докажите их!):
,
.
Указание
Воспользуйтесь инвариантностью функции относительно
следующего преобразования
:

Не забудьте доказать -инвариантность функции
.
Задачи на индуктивные функции
При решении задач из этого раздела необходимо выяснить, является
ли индуктивной заданная функция . В случае ее индуктивности
следует предъявить отображение
, иначе нужно построить
индуктивное
расширение
исходной функции и предъявить
для
него. В последнем
случае нужно также указать отображение
и исследовать
построенное
расширение на минимальность (минимальность не является обязательным
условием). Завершить решение следует написанием
программы, реализующей однопроходный алгоритм, с указанием соответствия
между программными переменными и
обозначениями, использованными в теоретической части решения. Необходимо
объяснить, как в программе реализуется вычисление
или
на пустой
(или ее заменяющей) цепочке, как именно реализовано перевычисление
функции при удлинении цепочки, и как находится
в
случае использования индуктивного расширения.
Задача 11.30. Напишите программу, определяющую значение в целой точке
многочлена,
заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).
Задача 11.31. Напишите программу, вводящую последовательность целых чисел, и печатающую количество ее максимальных элементов.
Задача 11.32. Напишите программу, определяющую номер первого элемента, равного
, в
последовательности целых чисел. В том случае, если число
в
последовательности не встречается, положите
равным нулю.
Задача 11.33. Напишите программу, вводящую последовательность вещественных чисел, и печатающую среднее арифметическое ее элементов (для непустой последовательности).
Задача 11.34. Напишите программу, определяющую количество вхождений
образца в последовательность символов.
Задача 11.35. Напишите программу, определяющую количество минимальных элементов в последовательности неположительных целых чисел.
Указание В данном случае для доопределения индуктивного расширения на пустой цепочке нет необходимости использовать величины Integer.MIN_VALUE или Integer.MAX_VALUE.
Задача 11.36. Напишите программу, определяющую дисперсию не пустой последовательности
действительных чисел.
Дисперсией последовательности
называется
величина
, где
— среднее арифметическое
элементов последовательности.
Указание
Так как

то вводя обозначения ,
,
, получим
.
Легко проверить, что функция
является индуктивной.
Задача 11.37. Напишите программу, определяющую значение в целой точке
многочлена,
заданного последовательностью его целых коэффициентов (в порядке
возрастания степеней).
Задача 11.38. Напишите программу, определяющую значение в целой точке
производной многочлена,
заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).
Указание
Продифференцировав по равенство
и подставив затем
, получите
соотношения
и
, которые помогут построить
индуктивное расширение исходной функции.
Задача 11.39. Напишите программу, определяющую значение в целой точке
производной многочлена,
заданного последовательностью его целых коэффициентов (в порядке
возрастания степеней).
Задача 11.40. Напишите программу, определяющую значение в целой точке
второй производной многочлена,
заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).
Задача 11.41. Напишите программу, определяющую правильность формулы над
алфавитом из четырех символов . Формула считается правильной,
если она может быть получена с помощью следующей НФБН:
.
Указание
Рассмотрите следующее индуктивное расширение
функции
, где
,
,
, определены следующим образом:
может быть продолжена до правильной формулы,
= разность числа левых и правых скобок в
,
последний элемент
.
Задача 11.42. Напишите программу, определяющую номер последнего элемента, равного
,
в последовательности целых чисел. В том случае, если число
в
последовательности не встречается, положите
.
Задача 11.43. Напишите программу, определяющую число локальных максимумов в последовательности целых чисел. Элемент называется локальным максимумом, если у него нет соседа большего, чем он сам. Например, в любой одноэлементной последовательности всегда ровно один локальный максимум.
Задача 11.44. Напишите программу, определяющую среднюю длину связной возрастающей подпоследовательности в последовательности целых чисел.
Задача 11.45. Напишите программу (быстрое возведение в степень), возводящую целое число в целую неотрицательную степень
, временная
сложность которой не должна превосходить
.
Указание
Рассмотрите эту функцию , как функцию на пространстве последовательностей
над алфавитом
. В качестве последовательности
нужно
взять инвертированное представление числа
в двоичной системе счисления.
Данная последовательность получается естественным образом —
последняя цифра числа
есть "b&1", предпоследняя получается
по той же формуле после сдвига вправо ( "b>>>=1;" ) и так далее.
Индуктивное расширение
исходной функции
легко находится, что и
позволяет написать требуемую программу.
Задача 11.46.
Напишите программу, определяющую количество вхождений
образца в последовательность символов.
Задача 11.47.
Напишите программу, определяющую значение в целой точке
-ой производной многочлена,
заданного последовательностью его целых коэффициентов (в порядке
убывания степеней).