可能重複:
nth ugly number
Find the Kth least number for expression (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等形式的數字。 最後把它們放在一起,但我不知道這是否能解決我的問題。
作業?面試嗎?我曾經作爲一個家庭作業,將在下面發佈解決方案。 –
根據http://stackoverflow.com/questions/7215315 '替代版本使用「循環迭代器」'是一個非常漂亮的Python解決方案,用於任何人決定在[本頁]中找到哪個Python解決方案(http:// rosettacode.org/wiki/Hamming_numbers#Alternate_version_using_.22Cyclic_Iterators.22) –
這是幾年前在考試中提出的一個問題,它考察了烏迪內卓越學校。我準備進入那裏,所以我試圖解決以前的測試。即使編程語言不同,我也很抱歉有重複的內容......我只是沒有嘗試「難看的數字」,因爲我認爲這只是測試作者發明的隨機名。 – Bakuriu