Possibili duplicati:
nth ugly number
Find the Kth least number for expression (2^x)*(3^y)*(5^z)come generare numeri dati i loro fattori primi, ma con esponenti sconosciuti?
Mi chiedo come risolvere questo problema in modo veloce ed elegante:
Definiamo "brutto" ogni numero n che può essere scritto nel formato: 2^x * 3^y * 5^z ;, dove x, y e z sono numeri naturali. Trova il 1500esimo numero brutto.
E.g. i primi numeri "brutto" sono:
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ...
ho cercato di risolvere questo problema usando la forza bruta, in questo modo:
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
ma ci vuole un bel po 'di tempo, e io "Mi piacerebbe trovare una soluzione più veloce e migliore.
Conosco i fattori primi di numeri brutti, ma non riesco a pensare a un modo per generare questi numeri seguendo l'ordine corretto.
Penso che ci sia un modo per generare questi numeri senza dover controllare tutti i numeri. Il problema è che sembra che gli esponenti dei fattori primi siano distribuiti in modo piuttosto casuale.
Guardate questa tabella:
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 |
------------------------
Come potete vedere i valori x, yez non sembrano seguire alcuna regola.
Qualcuno di voi può trovare una soluzione a questo problema?
Sto pensando di provare a dividere il problema in diverse parti. Poiché il problema è determinato dalla casualità degli esponenti, potrei provare a generare autonomamente le potenze di 2s, 3s, 5s e quindi i numeri della forma 2^x * 3^y, 2^x * 5^z ecc. E finalmente li metto insieme, ma non so se questo risolverà il mio problema.
Compiti? Colloquio? Ho avuto questo una volta come compito a casa, pubblicheremo la soluzione di seguito. –
secondo http://stackoverflow.com/questions/7215315 "La versione alternativa che utilizza" Iteratori ciclici "è una soluzione Python molto carina per chiunque decida quale soluzione Python leggere trovata in [questa pagina] (http: // rosettacode.org/wiki/Hamming_numbers#Alternate_version_using_.22Cyclic_Iterators.22) –
È un problema dato alcuni anni fa nell'esame che dà accesso alla Scuola di Eccellenza di Udine. Mi sto preparando per entrare lì, quindi sto cercando di risolvere i test precedenti. Mi dispiace per il duplicato, anche se il linguaggio di programmazione è diverso ... Semplicemente non ho provato "numeri brutti" perché pensavo che fosse solo un nome casuale inventato dall'autore del test. – Bakuriu