Задача:
Найти факториал 6!.
Решение:
Факториал будет равен 1*2*3*4*5*6. Эту последовательность
можно представить в виде геометрической последовательности и найти
сумму по соответствующей формуле. Но поступим по-другому, ведь
у нас в руках микроЭВМ. Все члены последовательности 1,2,3,4,..,6
отличаются друг от друга на 1. Можно составить такой циклический
алгоритм, который вычислит этот факториал. Пусть f - искомый факториал , i -
счётчик шагов(1,2,3..,6), тогда алгоритм будет такой:
После нажатия на кнопку "Run" "Кроха" выдаст результат на экран (screen)
в десятичном (deg) = 720 и двоичном виде (bin).
Заметим, что фаториал 7! и более
"Кроха" откажется вычислять и выдаст сообщение о переполнении памяти: "Overflow!".
1) увеличить i на 1
2) вычислить f=f*i (новая факториал=старый факториал умножить на текущее значение счётчика)
3) если 6 больше счётчика i, то перейти к 1) действию
4) если 6 меньше или равно i, то распечатать f на экране.
Таким образом, счётчик пробежит все значения от 1 до 20 и вычислит факториал.
Как распределить память? Попробуем распределить её, как в нашем алгоритме.
Договоримся хранить значение счётчика i в ячейке 111, шаг счётчика=1 в ячейке 110,
предел=6 в ячейке 101.
Итак, ячейка 000 будет такой:
000 001 111 110 111
(увеличить счётчик i на 1).
Следущая команда:
001 101 100 111 100
(вычислить f=f*i (новый факториал=старая факториал * текущее значение счётчика).
Третья команда:
010 110 101 111 000
(если 6 больше i, то перейти к 1) действию (ячейке 000)).
Остаётся только распечатать результат. Это будет последняя свободная ячейка 011:
011 111 100 100 100
(3 раза распечатать содержимое ячейки 101 (вычисленный факториал)).
Итак, приведём полный листинг программы перед её запуском:
001 101 100 111 100 (новый факториал=старая факториал * текущее значение счётчика)
010 110 101 111 000 (если 6 больше i, то перейти к 1) действию (ячейке 000))
011 111 100 100 100 (3 раза распечатать содержимое ячейки 101 - конечную сумму)
100 000 000 000 001 (начальное значение факториала = 1, иначе в итоге факториал получится 0)
101 000 000 000 110 (предел счётчика i = 6)
110 000 000 000 001 (шаг счётчика i = 1)
111 000 000 000 000 (счётчик i)
Ещё раз хотим отметить, что некоторые ячейки памяти мы использовали в качестве чисел
, а другие - как команды (хотя и они могут рассматриваться как числа).
А теперь, если хотите, можно решить этот пример на
практике