Программирование игр и головоломок - [64]
2. Игры с числами
Головоломка 3.
Остановитесь, когда вы получите 5 в качестве цифры единиц с нулем «в уме».
Головоломка 4.
Представленный здесь алгоритм эквивалентен алгоритму, который можно найти в старых книгах по арифметике, и который действует на целые числа, разбитые на куски но 2 цифры в каждом куске. Вы можете либо разыскать доказательство в этих книгах, либо посмотреть в моей книге «Основы программирования», как можно доказать, что программа, реализующая этот алгоритм, действительно вычисляет квадратный корень. Но это рассуждение слишком сложно, чтобы воспроизводить его здесь.
Лично я работаю по основанию 10. Я представляю числа цепочками цифр. Присоединить 1 справа легко: это просто конкатенация. Сдвинуть вправо легко: используется индекс, сообщающий, начиная с какой позиции нужно урезать. Именно этот индекс и изменяется. Складывать с 2 легко, так как может быть не более одного переноса. Единственная тонкая операция — вычитание, Не проводите сравнения перед вычитанием: оно стоит так же дорого, как и само вычитание. Сделайте копию той части, которая должна была бы быть изменена при вычитании, и если вы обнаружите, что вы не можете осуществить вычитание, — возьмите сохраненное значение.
Головоломка 5.
Задайте три индекса и три значения: i>2, i>3, i>5, x>2, x>3, x>5. Число i>2 есть индекс элемента последовательности, который, будучи умноженным на 2, дает подходящего кандидата на роль ближайшего значения (иначе говоря, удвоение числа с индексом i>2 − 1 дает число, которое содержится в уже сформированной части последовательности, но удвоение числа с индексом i>2 дает число, которое в сформированной части не содержится). Число x>2 получается удвоением числа с индексом i>2. Вы определяете аналогично i>3 и x>3 заменяя «удвоение» на «утроение» (произведение на 3 числа с индексом i>3 − 1 содержатся в построенной части последовательности, а число x>3 — утроенное число с индексом i>3 — в ней не содержится). Наконец, вы делаете то же самое для i>5 и x>5. Ближайшее число в последовательности есть наименьшее из чисел x>2, x>3, x>5. Назовем его х. Если x = x>2, то i>2 увеличивается на 1 и x>2 пересчитывается. То же самое для i>3 и i>5.
Головоломка 7.
Возьмем n = 3n' + 2. Тогда (2n − 1)/3 = 2n' + 1.
По общему правилу, непосредственно следующий за нечетным числом 2n' + 1 элемент равен (3(2n' + 1) + 1)/2 = 3n' + 2.
Если n дает n' при переходе (p, q), q > 1, т. е. если n имеет вид n = (2>p(2>qn' + 1)/3>p) − 1, то
n'' = (n − 1)/2 = (2>p−1(2>qn' + 1)/З>p) − 1.
Как и следовало ожидать, это имеет в точности тот смысл, что если деление на З>p можно выполнить нацело, то в связи с этим возникает соотношение между (p, q) и n'.
Если n" увеличить на 1, а затем умножить на 3>p−1/2>p−1, то получится (2>qn' + 1)/3.
Тогда нужно уменьшить результат на 1: получим (2>qn' − 2)/3. Но это число делится на 2, так что с помощью перехода (p − 1, 1) число n" дает
(2>q−1n' − 1)/3.
По общим правилам получаем
3 ((2>q−1n' − 1)/3) + 1 = 2>q−1n',
а затем n', что и доказывает наше утверждение.
Если вы примените это правило перехода к 4k + 1, то нужно добавить 1, что дает 4k + 2, делящееся на 2, но не на 4. Делим на 2 и умножаем на 3, что дает 6k + 3. Уменьшаем на 1 и затем делим на 2, и получается Зk + 1.
Если k нечетно, то это — элемент, следующий за k; так что за числом вида 4k + 1 с k нечетным следуют те же величины, что и за k.
Если k четно, то 4k + 1 дает 3k + 1.
Если существует цикл с единственным переходом p, q, т. е.
n = (2>p(2>qn + 1)/3>p) − 1,
то это возможно только в случае, когда существует такая пара p, q, что число
(З>p − 2>p)/(2>p+q − З>p)
— целое. Мы показали, что такой пары (p, q) нет.
Головоломка 10.
9*АВСДЕ + АВСДЕ = 10*АВСДЕ, что можно записать как АВСДЕ0. Отсюда получаем зашифрованное сложение:
FGHIJ + ABCDE = ABCDE0
Это показывает, что A = 1. Далее, J + E не может быть нулем, следовательно, J + Е = 10 и для I есть кое-что «в уме». Сумма F + A дает AB с A = 1, так что сумма F + 1, к которой, может быть, добавлено что-то «в уме», должна дать число, большее 9. Это может быть только в случаях 1 + 8 + 1 = 10, 9 + 1=10 или 1 + 9 + 1 = 11. Но, так как B ≠ A, то B = 0.
Тогда в сумме G + B рассмотрим цифру C как цифру единиц. Так как В = 0, то это означает, что для G «в уме» кое-что есть (потому что G ≠ С).
Отсюда получаем схему операции сложения:
Запишем, что A + B + C + D + E + F + G + H + I + J = 45,
А = 1, B = 0.
Запишем пять операций сложения с учетом переносов в старший разряд:
J + E = 10,
1 + I + D = 10k + E,
k + H + C = 10 + D,
1 + G + В = 10k' + С,
k' + F + A = 10.
Сложим их все. Вам остается
C + D + E = 17 − 9(k + k').
Но С + D + E не может быть меньше, чем 2 + 3 + 4 = 9, и не может быть больше, чем 6 + 7 + 9 (если F = 8 и k' = 1). Не может быть, чтобы у вас одновременно выполнялись соотношения k = k' = 1 (что давало бы отрицательную сумму С + D + E). Но не может быть и равенства k + k' = 1, так как тогда было бы С + D + E = 17 − 9 = 8, что слишком мало. Следовательно, k = k' = 0. Составим окончательную систему
J + E = 10,
I + D + 1 = E,
H + C = 10 + D,
G + 1 = С,
F = 9.
Закончите вы с помощью программы.
Головоломка 11.
Обозначим через
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.