Россия, Пошатово |
Переменные, выражения, присваивания
1.1.7. Дано натуральное (целое неотрицательное) число а и целое положительное число d. Вычислить частное q и остаток r при делении а на d, не используя операций div и mod.
Решение. Согласно определению, , .
{a >= 0; d > 0} r := a; q := 0; {инвариант: a = q * d + r, 0 <= r} while not (r < d) do begin | {r >= d} | r := r - d; {r >= 0} | q := q + 1; end;
1.1.8.Дано натуральное , вычислить ! ( , !).
1.1.9.Последовательность Фибоначчи определяется так: , , при . Дано , вычислить .
1.1.10. Та же задача, если требуется, чтобы число операций было пропорционально . (Переменные должны быть целочисленными.)
Указание. Пара соседних чисел Фибоначчи получается из предыдущей умножением на матрицу
- так что задача сводится к возведению матрицы в степень . Это можно сделать за действий тем же способом, что и для чисел.
1.1.11. Дано натуральное n, вычислить
1.1.12. То же, если требуется, чтобы количество операций (выполненных команд присваивания) было бы порядка (не более для некоторой константы ).
Решение. Инвариант: !, ! (важно не вычислять заново каждый раз !).
1.1.13.Даны два натуральных числа a и b, не равные нулю одновременно. Вычислить НОД(a,b) - наибольший общий делитель а и b.
Решение. Вариант 1.
if a > b then begin | k := a; end else begin | k := b; end; {k = max (a,b)} {инвариант: никакое число, большее k, не является общим делителем} while not ((a mod k = 0) and (b mod k = 0)) do begin | k := k - 1; end; {k - общий делитель, большие - нет}
Вариант 2 (алгоритм Евклида). Будем считать, что НОД(0,0)=0. Тогда НОД(a,b) =НОД(a-b,b) = НОД(a,b-a) ; НОД(a,0) =НОД(0,a) = a для всех .
m := a; n := b; {инвариант: НОД (a,b) = НОД (m,n); m,n >= 0 } while not ((m=0) or (n=0)) do begin | if m >= n then begin | | m := m - n; | end else begin | | n := n - m; | end; end; {m = 0 или n = 0} if m = 0 then begin | k := n; end else begin {n = 0} | k := m; end;
1.1.14.Написать модифицированный вариант алгоритма Евклида, использующий соотношения НОД(a,b) = НОД(a mod b, b) при , НОД(a,b) = НОД(a, b mod a) при .