2. Игры с числами
2. Игры с числами
Головоломка 3.
Я нашел это упражнение в монографии, посвященной языку Пролог. Предложенное там решение действует методом проб и ошибок. Но задача решается намного проще.
Как всегда, полностью определим задачу. Искомое число представляется в десятичной системе последовательностью цифр
cncn?1…c25
Умножая на 5, получаем
5cncn?1…c3c2
Отсюда следует, что c2 = 5. Все цифры ci точно так же итеративно вычисляются справа налево, обыгрывая оставшееся от предыдущего умножения «в уме»: когда вы умножаете крайнее справа 5 на 5, вы получаете 5 единиц, что и дает c2 = 5, и 2 «в уме». Тогда вы можете вычислить c3 и новую цифру «в уме» и продолжать шаг за шагом. Остается маленькая задача о том, как узнать, когда следует остановиться. Изучите ее сами; как обычно, я не хотел бы сообщать вам все…
Вы можете также действовать слева направо:
5cncn?1…c3c2 : 5 = cncn?1…c25
Деля левую цифру на 5, вы получаете cn = 1. Имея cn, вы можете продолжать деление. И здесь тоже вам нужно будет принимать во внимание перенос результата, полученного при предыдущем делении, и нужно будет знать, когда остановиться. Эти два метода по существу равносильны.
Остальное оставляю исследовать вам.
Головоломка 4.
Обычно я бываю глубоко разочарован тем, что нахожу в книгах по информатике или по математике касательно квадратных корней. Чаще всего вам предлагают метод Ньютона: пусть вам нужно извлечь квадратный корень из числа x. Вы образуете возвратную последовательность ui по правилу
ui+1 = (ui + (x/ui))/2.
Вне всякого сомнения, вы можете взять u0 = 1 в качестве начального значения. Эта последовательность очень быстро сходится к квадратному корню из x. Если, например, взять x = 50 и воспользоваться формулой
ui+1 = целая_часть ((ui + (x/ui))/2),
чтобы иметь дело только с целыми числами, то в качестве последовательных значений и вы получите
u0 = 1, u1 = 25, u2 = 13, u3 = 8, u5 = 7, u6 = 7.
Чтобы использовать здесь этот алгоритм, вы должны написать программу целочисленного деления двух целых чисел большой длины.
Другой способ действия основан на том факте, что разность двух последовательных квадратов есть нечетное число:
(n + 1)? ? n? = 2n + 1,
так что последовательные разности являются последовательными нечетными числами. Поэтому можно видеть, что сумма нечетных чисел от 1 до 2k ? 1 включительно есть k?. Обратно, если вычитать из n последовательно возрастающие числа, пока это возможно (не допуская, чтобы результат становился отрицательным), тогда искомый квадратный корень есть к, если последнее нечетное вычитаемое равно 2k ? 1. Таким образом, для 50
50 ? 1 = 49,
49 ? 3 = 46,
46 ? 5 = 41,
41 ? 7 = 34,
34 ? 9 = 25,
25 ? 11 = 14,
14 ? 13 = 1.
Нельзя продолжать, не получая отрицательной разности. Последнее нечетное вычитаемое равно 13, поэтому корень есть (13 + 1)/2 = 7 (и остаток 1). Этот способ гораздо лучше подходит для распространения на случай очень больших чисел, потому что вам требуется реализовать только две операции:
— прибавить 2 к большому числу;
— вычесть одно большое число из другого.
Но число шагов цикла равно искомому квадратному корню, а он может оказаться весьма большим.
Можно обобщить предыдущий алгоритм, используя свойства десятичной записи чисел. Данное число разделяется на куски по две цифры, начиная справа; затем мы начинаем вычитать последовательные нечетные числа из крайнего слева куска:
Если это нельзя продолжать дальше, то последнее вычитаемое число увеличивается на единицу, сдвигается на один шаг вправо, и следом за ней приписывается единица. Это — первое нечетное число, которое следует вычитать из предыдущего остатка.
В приведенном выше примере 7 + 1 = 8; приписывая 4, получаем 81 и продолжаем:
Поскольку продолжать дальше нельзя (последнее возможное вычитание из остатка — это крайнее справа), то последнее из вычитаемых чисел нужно увеличить на 1, а затем разделить на 2, чтобы получить корень. Последний остаток и есть остаток квадратного корня:
85 + 1 = 86, 86/2 = 43,
1909 = (43)2 + 60.
Этот алгоритм достаточно прост для программирования при длинных числах, и он дает вполне разумное время вычисления.
У вас много возможностей представлять свои данные. Так как мы оперируем с кусками из двух цифр, то вы можете задавать свои данные таблицами целых чисел в интервале от 0 до 99.
Вы можете представлять свои целые числа как цепочки символов, где используются только числовые символы (цифры) от 0 до 9. Выбор способа зависит от ваших предпочтений и от возможностей вашей машины оперировать с таблицами и цепочками. Тщательно рассмотрите, какие операции нужно сделать. Вы ничем не ограничены: почему бы не запрограммировать и сравнить два разных решения?
Я предложил вам алгоритм без доказательства. Поэтому попытайтесь его проверить…
Я предложил вам алгоритм для десятичной системы счисления. Можно предложить похожий алгоритм для двоичной системы. Тогда не возникнет цикл вычитаний последовательных нечетных чисел из каждого куска, поскольку в куске есть только одно нечетное число: 1. Алгоритм упрощается: если можно вычесть нечетное число — мы его вычитаем, в противном случае мы не делаем ничего. Затем сдвигаем, добавляем 1 и приписываем 1 в конце… Этот алгоритм намного легче реализовать. Но тогда нужно сначала перейти к основанию 2, а затем преобразовать двоичный результат в десятичный. Вам следует посмотреть, что более эффективно…
Головоломка 5.
Аккуратно поставим задачу. То, что от вас требуется, — это не взятая глобально последовательность, а вот что: если начало последовательности выписано, то нужно найти следующее число. Возьмем пример, данный в головоломке 5: какое число следует за 50?
Есть ровно три возможности.
1. Число делится на 2. После однократного деления на 2 оно не будет иметь других делителей нуля, кроме 2, 3 и 5. Следовательно, это число — из последовательности. Так как 50 : 2 = 25, то полученное частное больше, чем 25. Наименьшее число последовательности, большее 25, есть 27. Таким образом, если следующее за 50 число делится на два, то оно равно 2 ? 27 = 54.
2. Оно делится на 3. То же рассуждение. 50 : 3 = 16,7. Первое число последовательности, большее 16,7, есть 18. Если следующее за 50 число делится на 3, то это число равно 3 ? 18 = 54.
3. Оно делится на 5. 50 : 5 = 10. Следующее за 10 равно 12,
5 ? 12 = 60.
Таким образом, у нас 3 кандидата: 54, 54, 60. Наименьшее из этих трех и есть искомое.
Мы получили 54, используя только уже вычисленную часть последовательности Хэмминга.
Я предложил вам идею решения на примере. Вам следует ее обобщить, показать, что это всегда верно, и составить хорошую программу для решения.
Головоломка 6.
Я предлагаю вам начать с образования различных числовых последовательностей, получаемых вычеркиванием чисел. Вот первые из них:
1 : 2 3 4
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Исключения, возникающие при выполнении операций над числами с плавающей точкой
Исключения, возникающие при выполнении операций над числами с плавающей точкой Существует семь различных кодов исключений, которые могут возникать при выполнении операций с использованием данных вещественного типа. Первоначально эти исключения отключены и не могут
Функции XPath для работы с числами
Функции XPath для работы с числами В XPath имеются следующие функции для работы с числами:• ceiling(). Возвращает наименьшее целое, большее переданного функции числа,• floor(). Возвращает наибольшее целое, меньшее переданного функции числа;• number(). Приводит переданный ей параметр к
3.14.3. Сопоставление с числами, записанными римскими цифрами
3.14.3. Сопоставление с числами, записанными римскими цифрами Следующее довольно сложное регулярное выражение сопоставляется с любым правильно записанным римскими цифрами числом (до 3999 включительно). Как и раньше, для удобства восприятия образец разбит на части:rom1 =
5.2. Основные операции над числами
5.2. Основные операции над числами Обычные операции сложения, вычитания, умножения и деления в Ruby, как и во всех распространенных языках программирования, обозначаются операторами +, -, *, /. Операторы в большинстве своем реализованы в виде методов (и потому могут быть
5.7. Работа с очень большими числами
5.7. Работа с очень большими числами Управлять массами все равно что управлять немногими: дело в частях и в числе. Сунь-Цзы[9] При необходимости Ruby позволяет работать с произвольно большими целыми числами. Переход от Fixnum к Bignum производится автоматически, прозрачно для
5.9. Работа с рациональными числами
5.9. Работа с рациональными числами Класс Rational позволяет (во многих случаях) производить операции с дробями с «бесконечной» точностью, но лишь если это настоящие рациональные числа (то есть частное от деления двух целых чисел). К иррациональным числам, например ? или e, он
5.17. Поразрядные операции над числами
5.17. Поразрядные операции над числами Иногда требуется работать с двоичным представлением объекта Fixnum. На прикладном уровне такая необходимость возникает нечасто, но все-таки возникает.Ruby обладает всеми средствами для таких операций. Для удобства числовые константы
11.7. Инициализация контейнера случайными числами
11.7. Инициализация контейнера случайными числами ПроблемаТребуется заполнить произвольный контейнер случайными числами.РешениеМожно использовать функции generate и generate_n из заголовочного файла <algorithm> совместно с функтором, возвращающим случайные числа. Пример 11.13
2. Игры с числами
2. Игры с числами Арифметические развлечения Есть много примеров арифметических игр, головоломок и развлечений. Их можно найти в [BAL], [BER], [KUE]. Мы обращаемся и к другим источникам и добавляем некоторые задачи, которые представляют интерес собственно с точки зрения
4.6. Операции с комплексными числами
4.6. Операции с комплексными числами Класс комплексных чисел стандартной библиотеки С++ представляет собой хороший пример использования объектной модели. Благодаря перегруженным арифметическим операциям объекты этого класса используются так, как будто они
Операции с числами
Операции с числами Перечень арифметических операций в XPath довольно ограничен. К ним относится сложение, вычитание, умножение, деление и унарная операция отрицания, которая меняет значение операнда на противоположное. Кроме того, числа можно сравнивать при помощи
Игры с числами
Игры с числами Пятница 13(13)Программа должна выдать список из 13 ближайших тринадцатых пятниц, отсчитывая от текущей даты(14)Угадай числоПримерный сценарий:(компьютер) Загадано двух [трех, четырех, пяти] значное число, сколько попыток вам надо для отгадывания?(пользователь)
ИГРЫ: Ролевые игры: Жизнь офлайн
ИГРЫ: Ролевые игры: Жизнь офлайн Автор: Эмма Михейкина emma@goldeforests.ruКомпьютерная игра — это всегда имитация. Развитие технологий все сильнее приближает ее к реальности, но никакие пиксельные шейдеры и многомерный звук не способны свести это различие на нет. И если,
ИГРЫ: Маленькие убийцы: Простенькие компьютерные игры против дорогих блокбастеров
ИГРЫ: Маленькие убийцы: Простенькие компьютерные игры против дорогих блокбастеров Автор: Родион НасакинПричитания в прессе по поводу далекого от безоблачного положения индустрии компьютерных игр стали привычными. Рынок лихорадит уже второй год, потому что игры