Московский государственный индустриальный университет
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3331 / 379 | Оценка: 4.17 / 3.79 | Длительность: 24:17:00
Специальности: Программист
Дополнительный материал 1:

Все задачи курса

< Лекция 13 || Дополнительный материал 1: 1234567

Все задачи лекций 8-10

Полным решением задач, приведенных ниже, не может считаться только текст правильно написанной программы. Во всех случаях необходимо изложение теоретической части решения и описание соответствия между переменными программы и обозначениями, использованными при теоретическом исследовании.

Задачи на рекурсию

При решении задач из этого раздела необходимо обосновать как то, почему программа заканчивает работу, так и то, почему после ее завершения будет получен требуемый результат.

Задача 11.1. Напишите рекурсивную программу, перемножающую два целых числа, одно из которых неотрицательно, без использования операции умножения. Точные пред- и постусловия требуемой программы, временная сложность которой не должна превосходить \Theta(\log b), таковы: Q=(a\in \mathbb{Z}_M \land b\in \mathbb{Z}_M \land b \geqslant 0), R=(z=ab). Числа a и b в программе изменять нельзя.

Задача 11.2. Напишите программу, печатающую значение многочлена степени n\geqslant0 в заданной точке x_0. Коэффициенты многочлена хранятся в массиве a в порядке убывания степеней и являются целыми числами, также как и значение x_0. Величины n, x_0 и элементы массива a изменять в программе нельзя.

Задача 11.3. Напишите рекурсивную программу, печатающую значение производной многочлена степени n\geqslant0 в заданной точке x_0. Коэффициенты многочлена хранятся в массиве a в порядке убывания степеней и являются целыми числами, так же как и значение x_0. Величины n, x_0 и элементы массива a изменять в программе нельзя.

Указание Пусть P_n(x)=a_0x^n+a_1x^{n-1}+\ldots+a_{n-1}x+a_n. Продифференцируем по x равенство P_n(x) = x \cdot P_{n-1}(x) + a_n и подставим затем x=x_0. Мы получим следующие соотношения:

P'_0(x_0) = 0,

P'_n(x_0) = x_0 \cdot P'_{n-1}(x_0) + P_{n-1}(x_0).

Воспользовавшись ими и формулами

P_0(x_0) = a_0,

P_n(x_0) = x_0 \cdot P_{n-1}(x_0) + a_n,

легко определить рекурсивную функцию неотрицательного целого аргумента g\colon \mathbb{Z}_M
\rightarrow \mathbb{Z}_M \times \mathbb{Z}_M, g(n) =
(P'_n(x_0), P_n(x_0)) для вычисления которой и пишется программа.

Проектирование цикла при помощи инвариантa

При решении задач из этого раздела необходимо построить и доказать правильность построенной программы вида "S0;while(e)S;", а при отсутствии в условии задачи явно заданных инварианта цикла и ограничивающей функции объяснить предварительно, каким образом они были получены.

Задача 11.4. Напишите программу, перемножающую два целых числа, одно из которых неотрицательно, без использования операции умножения. Точные пред- и постусловия требуемой программы, временная сложность которой не должна превосходить \Theta(\log b), таковы: Q=(a\in \mathbb{Z}_M \land b\in \mathbb{Z}_M \land b \geqslant 0), R=(z=ab). При написании программы величины a и b изменять не разрешается, следует использовать инвариант I = 
(y \geqslant 0 \land z + xy = ab) и ограничивающую функция h = y.

Задача 11.5. Напишите программу, возводящую целое число в целую неотрицательную степень. Точные пред- и постусловия требуемой программы таковы: Q=(a\in \mathbb{Z}_M \land b\in \mathbb{Z}_M 
\land a > 0 \land b \geqslant 0), R=(z=a^b). При написании программы величины a и b изменять не разрешается, следует использовать инвариант I = 
(y \geqslant 0 \land z \cdot x^y = a^b) и ограничивающую функцию h = y.

Задача 11.6. Напишите программу, находящую приближенное значение квадратного корня a \in 
\mathbb{Z}_M^+ из заданного неотрицательного целого числа n. Вот более точная формулировка пред- и постусловия: Q=(n\in \mathbb{Z}_M \land n
\geqslant 0), R= (a \in \mathbb{Z}_M \land a \geqslant 0 \land a^2\leqslant n
\land (a + 1)^2 > n). При написании программы величину n изменять нельзя.

Задача 11.7. Напишите программу (линейный поиск), определяющую первое вхождение заданного целого числа x в заданный массив b[0..m-1] целых чисел ( m>0 ). Известно, что x находится в массиве b. Значения элементов массива b и число x в программе изменять нельзя.

Задача 11.8. Напишите программу, находящую сумму s элементов заданного целочисленного массива b[0..n-1], элементы которого и величину n изменять нельзя. Точные пред- и постусловия: Q = (n>0),

\displaystyle R=\left(s = \sum_{j=0}^{n-1} b[j]\right).

Задача 11.9. Напишите программу, находящую приближенное значение квадратного корня a \in 
\mathbb{Z}_M^+ из заданного неотрицательного целого числа n. Точные пред- и постусловия требуемой программы, временная сложность которой не должна превосходить \Theta(\log n), таковы: Q=(n\in \mathbb{Z}_M \land n
\geqslant 0), R= (a \in \mathbb{Z}_M \land a \geqslant 0 \land a^2\leqslant n
\land (a + 1)^2 > n). При написании программы величину n изменять нельзя.

Задача 11.10. Найдите минимальное число, содержащееся в каждом из трех упорядоченных по возрастанию массивов целых чисел, в предположении, что таковое существует.

Задача 11.11. Напишите программу, печатающую n -ое число Фибоначчи ( f_0=0, f_1=1, f_k=f_{k-1}+f_{k-2} \ \mbox{для $k>1$} ). При написании программы используйте Q=(n\in \mathbb{Z}_M \land n>0), R=(a=f_n), I=(1 \leqslant i \leqslant n \land a = f_i \land b = f_{i-1}), h=n-i. Число n в программе изменять нельзя.

Задача 11.12. Напишите программу, находящую частное q и остаток r от деления x на y, не использующую операций умножения и деления. При написании программы положите Q=(x\in \mathbb{Z}_M \land y\in
\mathbb{Z}_M \land x\geqslant 0 \land y>0), R=(0 \leqslant r < y \land
q y + r = x), I=(0 \leqslant r \land 0 < y \land q y + r = x), h=r-y+1. Величины x и y в программе изменять не разрешается.

Задача 11.13. Напишите программу, находящую наибольший общий делитель gcd(X,Y) двух целых положительных чисел X и Y, не использующую операций умножения и деления и не изменяющую величин X и Y. При написании программы положите Q=(X\in \mathbb{Z}_M \land Y\in \mathbb{Z}_M \land X>0 \land Y>0), R=(x=y=gcd(X,Y)), I=(0<x \land 0<y \land gcd(x,y)=gcd(X,Y)), h=x+y-2\cdot gcd(x,y).

Указание Воспользуйтесь следующими свойствами наибольшего общего делителя двух чисел не равных одновременно нулю (не забудьте научиться доказывать все эти свойства):

gcd(x,y)=gcd(x,y-x)=gcd(x-y,y),

gcd(x,y)=gcd(x,y+x)=gcd(x+y,y),

gcd(x,x)=x, gcd(x,y)=gcd(y,x), gcd(x,0)=gcd(0,x)=x.

Задача 11.14. Напишите программу, находящую приближенное значение квадратного корня a \in 
\mathbb{Z}_M^+ из заданного неотрицательного целого числа n. Вот более точная формулировка пред- и постусловия: (Q=n\in \mathbb{Z}_M \land n
\geqslant 0), R= (a \in \mathbb{Z}_M \land a \geqslant 0 \land a^2\leqslant n
\land (a + 1)^2 > n). При написании программы величину n изменять нельзя. Для построения инварианта удалите из постусловия конъюнктивный член a^2\leqslant n. Оцените временную сложность получившейся программы и сравните ее со сложностью программы, построенной в задаче 9.1.

Задача 11.15. Напишите программу, определяющую первое вхождение заданного целого числа x в заданный массив массивов b[0..m-1][0..n-1] целых чисел ( m>0,
n>0 ). Значения элементов массива b и числа x, m и n в программе изменять нельзя. В момент завершения должно быть либо b[i][j] = x, либо, если числа x в массиве нет, i=m. Точные пред- и постусловия требуемой программы таковы: Q=(m>0 \land n>0), R=((0\leqslant i <m \land 0 \leqslant j < n \land x = b[i][j])\lor
(i=m \land x \notin b[0..m-1][0..n-1])).

Указание Используйте инвариант, утверждающий, что x не находится в уже проверенных строках b[0..i-1] и среди уже проверенных элементов b[i][0..j-1] текущей строки i. В качестве ограничивающей функции возьмите h=(m-i)\cdot n - j + m - i.

Задача 11.16. Напишите программу (бинарный или двоичный поиск), определяющую для упорядоченного по неубыванию массива b[0..n-1] целых чисел и заданного целого числа x позицию i, в которую может быть вставлено это число без нарушения упорядоченности массива. Точные пред- и постусловия требуемой программы, временная сложность которой не должна превосходить \Theta(\log n), таковы: Q=(x\in \mathbb{Z}_M \land n\in \mathbb{Z}_M \land n >0
\land (\forall j\ 0 \leqslant j < n-1\colon b[j] \leqslant b[j+1])), R=(
(i=-1\land x < b[0])\lor
(0\leqslant i < n-1\land b[i] \leqslant x < b[i+1])\lor
(i=n\land b[n-1] \leqslant x)
). При написании программы величины x, n и элементы массива b изменять не разрешается, для построения инварианта используйте метод замены константы переменной.

Задача 11.17. Напишите программу, печатающую факториал введенного неотрицательного целого числа, изменять которое нельзя. Для построения инварианта используйте метод замены константы переменной.

Задача 11.18. Напишите программу, находящую наибольшее целое число, являющееся степенью двойки, не превосходящее заданного натурального числа n\in\mathbb{Z}_M, изменять которое в программе нельзя.

Указание Сначала выпишите формальную спецификацию программы, а затем постройте инвариант с помощью метода устранения конъюнктивного члена.

Задача 11.19. Напишите программу, находящую сумму s элементов заданного целочисленного массива b[0..n-1], элементы которого и величину n изменять нельзя. Точные пред- и постусловия: Q = (n>0),

\displaystyle R=\left(s = \sum_{j=0}^{n-1} b[j]\right).
Инвариант постройте методом замены константы 0 в постусловии R новой переменной i.

Задача 11.20. Напишите программу, находящую приближенное значение квадратного корня a \in 
\mathbb{Z}_M^+ из заданного неотрицательного целого числа n. Точные пред- и постусловия требуемой программы, временная сложность которой не должна превосходить \Theta(\log n), таковы: Q=(n\in \mathbb{Z}_M \land n
\geqslant 0), R= (a \in \mathbb{Z}_M \land a \geqslant 0 \land a^2\leqslant n
\land (a + 1)^2 > n). При написании программы величину n изменять нельзя, а инвариант следует построить методом замены константы a на переменную b в конъюнктивном члене a^2\leqslant n постусловия R.

Задача 11.21. Напишите программу, находящую наименьшее значение x \in 
\mathbb{Z}_M в заданном массиве целых чисел b[0..n-1], где n>0. Значения элементов массива b и число n в программе изменять нельзя, Q=(n\in \mathbb{Z}_M \land n>0), R=(
(\forall j\ 0\leqslant j <n\ x \leqslant b[j])\land
(\exists k\ 0\leqslant k <n\ x = b[k])), инвариант постройте методом замены константы n на переменную i.

Задача 11.22. Напишите программу, находящую длину p \geqslant 1 самой длинной площадки в упорядоченном по неубыванию массиве b[0..n-1] целых чисел. Площадкой мы называем последовательность нескольких равных значений. Значения элементов массива b и число n>0 в программе изменять нельзя, Q=(n\in \mathbb{Z}_M \land n>0\land 
(\forall j\ 0 \leqslant j < n-1\ b[j] \leqslant b[j+1])), R=(
((\exists k\ 0\leqslant k \leqslant n-p\ b[k]=b[k+p-1])\land
(\forall j\ 0\leqslant j \leqslant n-p+1\ b[j] \ne b[j+p]))), инвариант постройте методом замены константы n на переменную i.

Задача 11.23. Напишите программу, находящую число m \geqslant 1 площадок в упорядоченном по неубыванию массиве b[0..n-1] целых чисел. Площадкой мы называем последовательность нескольких равных значений. Значения элементов массива b и число n>0 в программе изменять нельзя.

Указание Воспользуйтесь формулировкой предыдущей задачи.

Задача 11.24. Напишите программу, печатающую значение многочлена степени n\geqslant0 в заданной точке x_0. Коэффициенты многочлена хранятся в массиве a в порядке убывания степеней и являются целыми числами, так же как и значение x_0. Величины n, x_0 и элементы массива a изменять в программе нельзя. Для построения инварианта используйте метод замены константы переменной.

< Лекция 13 || Дополнительный материал 1: 1234567
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева