Я могу придумать несколько решений.Что будет работать лучше всего, зависит от вашего языка программирования.
Во-первых, вы могли бы продолжить свое представление о числах с плавающей запятой, но использовать пакет с расширенной точностью или числа с плавающей запятой с повышенной точностью.В Python вы можете использовать стандартный модуль decimal
.Прежде чем начать, вы можете установить точность своих номеров достаточно высоко, чтобы покрыть возможное количество добавленных номеров.Для 1000 дополнений будет достаточно 302 десятичных знака.Некоторые языки или пакеты имеют неограниченную точность, поэтому вам не нужно заранее устанавливать точность.
Во-вторых, вы можете использовать рациональные числа.В Python есть модуль fractions
, а поскольку целые числа Python имеют произвольную точность, то же самое можно сказать и о дробях.
В-третьих, вы можете реализовать свои собственные дроби, используя два набора натуральных чисел.Кортеж (a, b)
'представляет собой положительное рациональное число a/b
, но вы реализуете эти «рациональные числа» самостоятельно.Вы начинаете с (1, 1)
.Тогда (a, b)
меньше (c, d)
тогда и только тогда, когда a*d < b*c
.Вы делаете кортеж (a, b)
меньшим с (a, b+1)
и увеличиваете его с (a+1, b)
.Вы получаете кортеж между (a, b)
и (c, d)
с (a+c, b+d)
.Это работает лучше всего, если целые числа имеют произвольную точность.
В-четвертых, вы могли бы использовать 2-кортежа с первым элементом - целым числом, а вторым - строкой.Кортеж до (0, 'A')
равен (-1, 'A')
, а кортеж после (0, 'Z')
равен (0, 'ZA')
, или вы можете использовать (1, 'Z')
.Как вы уже знаете, кортеж между (0, 'A')
и (0, 'B')
равен (0, 'AB')
.
В-пятых, вы можете смоделировать дерево двоичного поиска (BST).Поскольку вам нужен список, а не фактический BST, вы имитируете его, делая каждый элемент в своем списке представляющим узел в BST, где 'L'
представляет левого сына, а 'R'
представляет правого сына.Вы начинаете список с одного элемента ''
, пустой строки, которая представляет корень BST.Чтобы получить элемент слева от самого левого элемента, объедините 'L'
до конца строки, чтобы получить нужный элемент.Чтобы получить элемент справа от самого правого элемента, объедините 'R'
до конца строки.Чтобы получить предмет между двумя смежными предметами, мы понимаем, что один должен быть начальной частью другого.Если левый элемент длиннее правого, объедините 'R'
с левым элементом.Если левый элемент короче правого, соедините 'L'
с правым элементом.Обратите внимание, что этот метод изоморфен использованию дробей, начинающихся с 1
, а добавление 'L'
изоморфно вычитанию степени 1/2
, а добавление 'R
изоморфно добавлению степени 1/2
.Но строки избегают проблемы конечной точности.
Я могу подумать и о других возможностях.Если бы я реализовал вашу идею, я бы использовал fractions
в Python, так как они хорошо интегрированы в язык.Тогда заказ, печать и т. Д. Уже обрабатываются на языке.