Пусть ^ означает право-ассоциативный оператор возведения в степень, т.е. a^b^c = a^(b^c). Например, 2^3^2 = 2^(3^2) = 512. Во избежание недоразумений заметим, что в общем случае a^b^c ≠ a^(b*c).
Рассмотрим выражения вида a₁^a₂^...^aₙ, где каждый из операндов aₖ равен 2 или 3.
Требуется написать программу, которая будет печатать эти выражения, упорядоченные по их численным значениям. Программа должна быть способна распечатать сотни тысяч выражений за приемлемое время. Ошибки в распечатке из-за ошибок округления (равно как и по другим причинам) не допускаются. Для ясности, вот ожидаемое начало распечатки:
N>Требуется написать программу, которая будет печатать эти выражения, упорядоченные по их численным значениям. Программа должна быть способна распечатать сотни тысяч выражений за приемлемое время.
Альтернативно, написать программу, которая принимает порядковый номер N (начиная с 1) выражения в этой распечатке, и печатает соответствующее выражение. Для N < 10^6 время выполнения задачи должно быть порядка нескольких секунд или меньше.
N>Для ясности, вот ожидаемое начало распечатки:
среди первых членов ряда присутствует 2^3^3^3 (=2^7625597484987), но отсутствует 2^3^3^2 (=2^19683), которое очевидно меньше.
либо у меня проблемы с арифметикой, либо одно из двух.
Здравствуйте, nikov, Вы писали:
N>Требуется написать программу, которая будет печатать эти выражения, упорядоченные по их численным значениям. Программа должна быть способна распечатать сотни тысяч выражений за приемлемое время. Ошибки в распечатке из-за ошибок округления (равно как и по другим причинам) не допускаются. Для ясности, вот ожидаемое начало распечатки:
Предлагаю такой подход.
Написать генератор программы, который находит первый миллион выражений за произвольное время, оформляет их в массив строковых литералов, а дальше всё просто
Здравствуйте, Muxa, Вы писали:
N>>Для ясности, вот ожидаемое начало распечатки: M>среди первых членов ряда присутствует 2^3^3^3 (=2^7625597484987), но отсутствует 2^3^3^2 (=2^19683), которое очевидно меньше. M>либо у меня проблемы с арифметикой, либо одно из двух.
Здравствуйте, nikov, Вы писали:
M>>Так а можно больше чисел (штук 100) и без ошибок? А то закончил на самом интересном.
N>Правильное начало здесь (операторы ^ для простоты опущены).
Триллионный (10^12-й) член равен 3222222222223222323223232232323322232222.
Член с номером 10^100 равен
Алгоритм построение этого ряда чисел я понял, но чтобы его закодировать без багов у меня уйдёт пара дней, не меньше.
Боюсь этот твой этюд не для меня
Будем считать я слился.
Здравствуйте, Muxa, Вы писали:
M>Алгоритм построение этого ряда чисел я понял, но чтобы его закодировать без багов у меня уйдёт пара дней, не меньше. M>Боюсь этот твой этюд не для меня
На самом деле он кодируется в несколько строчек, если уловить идею.
Написание строгого доказательства корректности может занять некоторое время (оно несколько рутинное), хотя понять его интуитивно и набросать основные моменты можно тоже в несколько строчек.
Здравствуйте, Кодт, Вы писали:
К>Предлагаю такой подход. К>Написать генератор программы, который находит первый миллион выражений за произвольное время, оформляет их в массив строковых литералов, а дальше всё просто
Поймал
Ну ладно, вычисление a_n должно занимать сублинейное время от n.
По поводу константы — моя реализация находит одно значение a_n для n<10^5000 за время меньше секунды.
Список a_n для n=1..10^5 строится тоже меньше секунды. Хотя это наверняка можно ускорить, если переписать на C.
N>На самом деле он кодируется в несколько строчек, если уловить идею. N>Написание строгого доказательства корректности может занять некоторое время (оно несколько рутинное), хотя понять его интуитивно и набросать основные моменты можно тоже в несколько строчек.
Видимо у нас с тобой разные алгоритмы.
Мой строит двоичное дерево "двоечки налево, троечки направо", в котором путь от корня до каждого узла соответствует числу из ряда.
Также все узлы пронумерованы хитрым способом согласно позиции числа в результируещем ряду.
В твоем алгоритме присутствует дерево в каком либо виде?