Краткий ответ
Вызов Get-number(n)
возвращает n th наименьшее натуральное число, которое имеет только 2, 3 или 5 в качестве простых факторов. Список таких номеров выглядит так:
{1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, ...}
Подробное объяснение
Полный код имеет две функции. Я объясню каждый шаг один за другим.
Получить номер (п)
function Get-Number(n)
Q ← NIL
Enqueue(Q,1)
While n > 0 do
x ← Dequeue(Q)
Unique-Enqueue(Q,2x)
Unique-Enqueue(Q,3x)
Unique-Enqueue(Q,5x)
n ← n – 1
return x
- Создана пустая очередь с именем
Q
. На следующем шаге мы нажимаем 1 к нему, делая Q = [1]
.
- Вынимаем самый правый номер
x
. Затем позвоните Unique-Enqueue(Q,2x)
, Unique-Enqueue(Q,3x)
и Unique-Enqueue(Q,5x)
соответственно.
- В конце мы возвращаем окончательное значение
x
. Таким образом, мы отбрасываем очередь Q
в конце функции и сохраняем только окончательное значение x
.
В целом, если задан вход n
, эта функция вернет вывод x
, который можно получить после выполнения всех вызовов функции, как указано выше.
Теперь давайте посмотрим на другую функцию.
Уникальные Епдиеий (Q, X) * * тысяча тридцать семь
function Unique-Enqueue(Q,x)
i ← 0
while i < |Q| ^ Q[i] < x do
i ← i + 1
if i < |Q| ^ x = Q[i] then
return
Insert(Q,i,x)
В текущем Q
продолжайте двигаться вправо, пока не наберете номер
не удовлетворяющий Q[i] < x
, то есть найти первое число в очереди, перемещающееся слева направо, которое по крайней мере столь же велико, как x
.
Существует три возможных сценария. Если это число равно x
, остановитесь. Если это число больше x
, введите x
перед этим числом. Если такого номера нет, введите x
в конце.
Пример дела
Допустим, мы звоним Get-number(4)
:
Первоначально Q = [1]
.
Q = [2,3,5]
после первого цикла.
Q = [3,4,5,6,10]
после второго цикла.
Q = [4,5,6,9,10,15]
после третьего цикла.
Q = [5,6,8,9,10,12,15,20]
после четвертого цикла.
Следовательно, Get-number(4)
возвращает 4
, поскольку это было последнее значение для нашего x
.