Возможные дубликаты:
nth уродливый номер
Найти наименьшее число Kth для выражения (2 ^ x) * (3 ^ y) * (5 ^ z)
Мне интересно, как решить эту проблему быстрым и элегантным способом:
Мы определяем "уродливое" каждое число n, которое можно записать в виде: 2 ^ x * 3 ^ y * 5 ^ z;, где x, y и z - натуральные числа. Найдите 1500-е уродливое число.
например. первые "уродливые" цифры:
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...
Я попытался решить эту проблему с помощью грубой силы следующим образом:
import itertools as it
def is_ugly(n):
'''Return `True` if *n* is an ugly number.'''
if n == 1:
return True
while not n % 2:
n //= 2
while not n % 3:
n //= 3
while not n % 5:
n //= 5
return n == 1
def nth_ugly(n):
'''Return the nth ugly number.'''
num = 0
for i in it.count(1):
if is_ugly(i):
num += 1
if num == n:
return i
Но это занимает довольно много времени, и я бы хотел найти более быстрое и лучшее решение.
Я знаю основные факторы уродливых чисел, но я не могу придумать способ генерации этих чисел в правильном порядке.
Я думаю, что должен быть способ генерировать эти числа без необходимости проверять все числа. Проблема состоит в том, что, по-видимому, экспоненты простых факторов распределены довольно случайным образом.
Посмотрите на эту таблицу:
n |number| x | y | z |
------------------------
1 | 1 | 0 | 0 | 0 |
------------------------
2 | 2 | 1 | 0 | 0 |
------------------------
3 | 3 | 0 | 1 | 0 |
------------------------
4 | 4 | 2 | 0 | 0 |
------------------------
5 | 5 | 0 | 0 | 1 |
------------------------
6 | 6 | 1 | 1 | 0 |
------------------------
7 | 8 | 3 | 0 | 0 |
------------------------
8 | 9 | 0 | 2 | 0 |
------------------------
9 | 10 | 1 | 0 | 1 |
------------------------
10 | 12 | 2 | 1 | 0 |
------------------------
11 | 15 | 0 | 1 | 1 |
------------------------
12 | 16 | 4 | 0 | 0 |
------------------------
13 | 18 | 1 | 2 | 0 |
------------------------
14 | 20 | 2 | 0 | 1 |
------------------------
15 | 24 | 3 | 1 | 0 |
------------------------
Как вы можете видеть, значения x, y и z, похоже, не следуют никакому правилу.
Может ли кто-нибудь из вас найти какое-либо решение этой проблемы?
Я собираюсь разделить проблему в разных частях. Поскольку проблема определяется случайностью экспонентов, я мог бы попытаться независимо генерировать степени 2s, 3s, 5s, а затем числа вида 2 ^ x * 3 ^ y, 2 ^ x * 5 ^ z и т.д. И, наконец, собрать их вместе, но я не знаю, решит ли это мою проблему.