Другие языки программирования и технологии

Вычислите, чему будет равна переменная res.

Робот Абит Кфушский учится программировать себя самостоятельно, он долго изучал один древний малоизвестный язык программирования KFU++. После он написал первую программу. Вычислите, чему будет равна переменная res.
integer AbitFunction (integer a, integer b, integer n)
{
if (n == 0) return 1;
if (n MOD 2 == 1)
return (AbitFunction(a, b, n-1) MOD b)* (a MOD b) MOD b;
else {
integer c = AbitFunction (a, b, n/2);
return (c MOD b) *(c MOD b) MOD b;
}
}
integer main()
res = AbitFunction(2, 10, 100000);
return 0;
}
В языке KFU++ оператор "MOD" означает взятие остатка от деления, "==" - сравнение.
Ответ в задании должен быть целым числом. Все символы вводите без пробелов.
"a" и "b" никогда не меняются. На протяжении всего выполнения эти переменные имеют значения 2 и 10.

Функция содержит 3 ветки выполнения:
1. Если n=0: вернуть 1
2. Если n нечётное: Запустить рекурсию с n=n-1
3. Если n чётное: Запустить рекурсию с n=n/2

Функция AbitFunction пройдёт следующие итерации:
100000 50000 25000 12500 6250 3125 3124 1562 781 780 390 195 194 97 96 48 24 12 6 3 2 1 0

Эта рекурсия построена так, что по факту последняя итерация будет первой, а потому с этого момента будем рассматривать итерации в обратном порядке

Учитывая что b всегда равна 10, в указанном случае функция для указанных шагов делает следующее:
1. Если n=0: вернуть 1
2. Если n нечётное: умножить на 2 последнюю цифру результата прошлой итерации и вернуть последнюю цифру получившегося числа
3. Если n чётное: возвести в квадрат последнюю цифру результата прошлой итерации и вернуть последнюю цифру получившегося числа

Ну что, поехали считать
0: 1
1: 2
2: 4
3: 8
6: 64 = 4
12: 16 = 6
24: 36 = 6
48: 36 = 6
96: 36 = 6
97: 12 = 2
194: 4
195: 8
390: 64 = 4
780: 16 = 6
781: 12 = 2
1562: 4
3124: 16 = 6
3125: 12 = 2
6250: 4
12500: 16 = 6
25000: 36 = 6
50000: 36 = 6
100000: 36 = 6

В итоге получится 6 (Дельфийский совсем немного ошибся... возможно совпадение, а возможно последнюю операцию забыл провести)

Реальное назначение такой функции для меня осталось загадкой. А ещё, попадись мне такой код в реальном мире, я бы к автору этого кода поехал бы с молотком поздороваться :)) Ни одного комментария, вместо нормального названия переменных какие-то a,b и n, да ещё и в одном блоке if...else автор позволяет себе использовать 2 разных синтаксиса (со скобками и без) тем самым нарушая читабельность кода. Ощущение что сам код был написан так, что бы его невозможно было прочитать.

Это курсы по обратному декодированию кода после обфускации? :))
ЛТ
Леонид Тихомиров
42 958
Лучший ответ
Ты знаешь, у тебя тут настолько глубокая и ветвистая рекурсия, что в мозгу посчитать весьма затруднительно. Потому придется тебе перевести KFU++ на любой другой язык и запустить программу.

Если не ошибаюсь, то должно получиться 36.
Wlad Tews
Wlad Tews
96 029

Похожие вопросы