1) 144 - это 12². Следующий квадрат - это 13²=169 и из 169 мы никак не получим за 4 вычитания двоек число 144. Поэтому последняя команда - это 1 (возведи в квадрат). 2) Теперь из 2 надо получить 12 не более, чем за 4 команды. Если 2 возвести в квадрат, получим 4 и этого мало, поэтому возведем 4 еще раз в квадрат, получив 16. Два подряд вычитания двоек как раз дадут 12. 3) Решение 1 (возведи в квадрат) - получаем 4 1 (возведи в квадрат) - получаем 16 2 (вычти 2) - получаем 14 2 (вычти 2) - получаем 12 1 (возведи в квадрат) - получаем 144
Так как язык не указан, приведу пример на SWI-Prolog.
Код:
read_int(Int) :- read(Int), integer(Int).split_int_by_numbers(0, []) :- !.split_int_by_numbers(N, [Number|Ints]) :- Number is mod(N, 10), RestN is div(N, 10), split_int_by_numbers(RestN, Ints).test_to_div(_, []).test_to_div(N, [Number|Ints]) :- mod(N, Number) =:= 0, test_to_div(N, Ints). test(Int) :- split_int_by_numbers(Int, Numbers), test_to_div(Int, Numbers), write(Int), write(" - Yes!"), nl.test(Int) :- write(Int), write(" - No!"), nl.?- read_int(Int), test(Int).