| Россия, Пошатово |
Переменные, выражения, присваивания
1.1. Задачи без массивов
1.1.1. Даны две целые переменные a, b. Составить фрагмент программы, после исполнения которого значения переменных поменялись бы местами (новое значение a равно старому значению b и наоборот).
Решение. Введем дополнительную целую переменную t.
t := a; a := b; b := t;
Попытка обойтись без дополнительной переменной, написав
a := b; b := a;
не приводит к цели (безвозвратно утрачивается начальное значение переменной a ).
1.1.2. Решить предыдущую задачу, не используя дополнительных переменных (и предполагая, что значениями целых переменных могут быть произвольные целые числа).
Решение.Начальные значения a и b обозначим a0, b0.
a := a + b; {a = a0 + b0, b = b0}
b := a - b; {a = a0 + b0, b = a0}
a := a - b; {a = b0, b = a0}1.1.3.
Дано целое число а и натуральное (целое
неотрицательное) число n. Вычислить
.
Другими словами, необходимо составить программу, при
исполнении которой значения переменных а и n не
меняются, а значение некоторой другой переменной
(например, b ) становится равным
.
(При этом разрешается использовать и другие переменные.)
Решение. Введем целую переменную k, которая меняется
от 0 до n, причем поддерживается такое свойство:
).
k := 0; b := 1;
{b = a в степени k}
while k <> n do begin
| k := k + 1;
| b := b * a;
end;Другое решение той же задачи:
k := n; b := 1;
{a в степени n = b * (a в степени k)}
while k <> 0 do begin
| k := k - 1;
| b := b * a;
end;1.1.4.Решить предыдущую задачу, если требуется, чтобы число
действий (выполняемых операторов присваивания) было порядка
(то есть не превосходило бы
для некоторой константы
;
- это степень,
в которую нужно возвести
, чтобы получить
).
Решение. Внесем некоторые изменения во второе из предложенных решений предыдущей задачи:
k := n; b := 1; c:=a;
{a в степени n = b * (c в степени k)}
while k <> 0 do begin
| if k mod 2 = 0 then begin
| | k:= k div 2;
| | c:= c*c;
| end else begin
| | k := k - 1;
| | b := b * c;
| end;
end;Каждый второй раз (не реже) будет выполняться первый вариант оператора выбора (если k нечетно, то после вычитания единицы становится четным), так что за два цикла величина k уменьшается по крайней мере вдвое.
1.1.5.Даны натуральные числа а, b. Вычислить произведение
, используя в программе лишь
операции +, -, =, <>.
Решение.
k := 0; c := 0;
{инвариант: c = a * k}
while k <> b do begin
| k := k + 1;
| c := c + a;
end;
{c = a * k и k = b, следовательно, c = a * b}1.1.6.
Даны натуральные числа а и b. Вычислить их сумму
. Использовать операторы присваивания лишь
вида

Решение.
...
{инвариант: c = a + k}
...