duplicados posibles:
nth ugly number
Find the Kth least number for expression (2^x)*(3^y)*(5^z)cómo generar números dados sus factores primos, pero con exponentes desconocidos?
Me pregunto cómo resolver este problema de una manera rápida y elegante:
Definimos "feo" cada número n que se puede escribir en la forma: 2^x * 3^y * 5^z ;, donde x, y y z son números naturales. Encuentra el número feo número 1500.
E.g. los primeros números "feos" son:
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...
He tratado de resolver este problema usando la fuerza bruta, de esta manera:
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
pero se necesita mucho tiempo, y yo Me gustaría encontrar una solución más rápida y mejor.
Conozco los factores primos de los números feos, pero no se me ocurre una manera de generar estos números siguiendo el orden correcto.
Creo que debe haber una manera de generar estos números sin tener que verificar todos los números. El problema es que parece que los exponentes de los factores primos se distribuyen de forma bastante aleatoria.
mirada a esta tabla:
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 |
------------------------
Como se puede ver no parecen x, y, z los valores que seguir ninguna regla.
¿Alguien puede encontrar alguna solución a este problema?
Estoy pensando en tratar de dividir el problema en diferentes partes. Dado que el problema está determinado por la aleatoriedad de los exponentes, podría intentar generar independientemente los poderes de 2s, 3s, 5s y luego los números de la forma 2^x * 3^y, 2^x * 5^z, etc. Y finalmente ponerlos juntos, pero no sé si esto resolverá mi problema.
¿Tarea? ¿Entrevista? Tuve esto una vez como tarea, publicaré la solución a continuación. –
según http://stackoverflow.com/questions/7215315 La 'versión alternativa que utiliza' iteradores cíclicos '' es una solución de Python muy bonita para cualquiera que decida qué solución de lectura de Python encontrar en [esta página] (http: // rosettacode.org/wiki/Hamming_numbers#Alternate_version_using_.22Cyclic_Iterators.22) –
Es un problema presentado hace algunos años en el examen que da acceso a la Escuela de Excelencia de Udine. Me estoy preparando para ingresar allí, así que estoy tratando de resolver las pruebas anteriores. Lamento el duplicado, incluso si el lenguaje de programación es diferente ... Simplemente no intenté con "números feos" porque pensé que era solo un nombre aleatorio inventado por el autor de la prueba. – Bakuriu