Еще пример задания:
В результате выполнения фрагмента программы
while n 0 do begin
write ( 2*(n mod 10)+1);
n := n div 10;
end;
на экран выведено число 13717. Укажите все числа, которые могли находиться в переменной n до выполнения этого цикла.
Решение (вариант 1, аналитический):
прежде всего, заметим, что для вывода используется оператор write, который не переходит на следующую строку; поэтому числа в цикле будут выводиться в одной строке «вплотную» друг к другу, без промежутков
вспомним, что n mod 10 – остаток от деления числа на 10 – это последняя цифра числа в десятичной системе счисления;
операция n div 10 (деление нацело на 10) равносильна отбрасыванию последней цифры в десятичной системе счисления
эти две операции выполняются пока значение переменной n не станет равно нулю
анализируя алгоритм, можно придти выводу, что этот фрагмент программы выводит на экран числа , где – это -ая цифра с конца числа
подумаем, в каком интервале находится значение , если – это цифра от 0 до 9: получаем интервал от до
поэтому разбить цепочку 13717 на части можно следующими способами:
1 – 3 – 7 – 17
1 – 3 – 7 – 1 – 7
13 – 7 – 17
13 – 7 – 1 – 7
в любом варианте разбиения каждое число получено по формуле , поэтому можно сразу определить цифры соответствующих чисел по формуле :
1 – 3 – 7 – 17 0 – 1 – 3 – 8
1 – 3 – 7 – 1 – 7 0 – 1 – 3 – 0 – 3
13 – 7 – 17 6 – 3 – 8
13 – 7 – 1 – 7 6 – 3 – 0 – 3
вспоминаем, что цифры числа в цикле обрабатываются, начиная с последней, поэтому в ответе нужно перечислить числа 836, 3036, 8310 и 30310.
таким образом, правильный ответ – 836, 3036, 8310, 30310.
Возможные ловушки и проблемы: нужно уметь анализировать работу алгоритма, «прокручивать» его в уме можно забыть, что цифры числа обрабатываются в обратном порядке, начиная с последней |
Решение (вариант 2, перебор, М.Н. Мамчур, УГАТУ):
для вывода используется оператор write, который не переходит на следующую строку; поэтому числа в цикле будут выводиться в одной строке «вплотную» друг к другу, без промежутков
вспомним, что n mod 10 – остаток от деления числа на 10 – это последняя цифра числа в десятичной системе счисления;
операция n div 10 (деление нацело на 10) равносильна отбрасыванию последней цифры в десятичной системе счисления
эти две операции выполняются пока значение переменной n не станет равно нулю
составим таблицу, в которой представим все возможные для вывода числа (последний столбец):
Исходная цифра | n mod 10 | 2*(n mod 10)+1 |
0 | 0 | 1 |
1 | 1 | 3 |
2 | 2 | 5 |
3 | 3 | 7 |
4 | 4 | 9 |
5 | 5 | 11 |
6 | 6 | 13 |
7 | 7 | 15 |
8 | 8 | 17 |
9 | 9 | 19 |
на основе таблицы, разобьем нашу цепочку 13717 на все возможные комбинации:
1 – 3 – 7 – 1 – 7
1 – 3 – 7 – 17
13 – 7 – 17
13 – 7 – 1 – 7
из этой же таблицы видим, что каждому числу в этой цепочке соответствует исходная цифра (первый столбец); таким образом, преобразуем полученные комбинации в наборы исходных цифр:
0 – 1 – 3 – 0 – 3
0 – 1 – 3 – 8
6 – 3 – 8
6 – 3 – 0 – 3
5) во фрагменте программы цифры числа обрабатываются в обратном порядке, начиная с последней, поэтому в ответе нужно перечислить числа, записанные в обратном порядке, т.е. 30310, 8310, 836, 3036.
таким образом, правильный ответ – 30310, 8310, 836, 3036.