筆試的時候遇到這個題,當時沒做出來。
參考資料:大佬傳送門,傳送門二。
題目:我們把只包含因子2、3和5的數稱作醜數(ugly number)。
例如6、8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。 求按從小到大的順序的第1500個醜數
方法一:簡單粗暴,分解每乙個數,看他的因數是不是只有2,3,5。
**:
import time
def finduglynum():
time.clock()
uglynum =
n = int(input())
i = 1
count = 0
while true:
temp = i
while temp%2 == 0:
temp = temp//2
while temp%3 == 0:
temp = temp//3
while temp%5 == 0:
temp = temp//5
if temp == 1:
count += 1
if count >= n:
break
i += 1
print(uglynum)
# 測試
finduglynum()
計算前1000個醜叔,執行結果:耗費31.84秒。
方法二:
試圖只計算醜數,而不在非醜數的整數上花費時間。根據醜數的定義,醜數應該是另乙個醜數乘以2、3或者5的結果(1除外)。因此我們可以建立乙個陣列,裡面的數字是排好序的醜數。裡面的每乙個醜數是前面的醜數乘以2、3或者5得到的。
這種思路的關鍵在於怎樣確保陣列裡面的醜數是排好序的。我們假設陣列中已經有若干個醜數,排好序後存在陣列中。我們把現有的最大醜數記做m。現在我們來生成下乙個醜數,該醜數肯定是前面某乙個醜數乘以2、3或者5的結果。我們首先考慮把已有的每個醜數乘以2。在乘以2的時候,能得到若干個結果小於或等於m的。由於我們是按照順序生成的,小於或者等於m肯定已經在陣列中了,我們不需再次考慮;我們還會得到若干個大於m的結果,但我們只需要第乙個大於m的結果,因為我們希望醜數是按從小到大順序生成的,其他更大的結果我們以後再說。我們把得到的第乙個乘以2後大於m的結果,記為m2。同樣我們把已有的每乙個醜數乘以3和5,能得到第乙個大於m的結果m3和m5。那麼下乙個醜數應該是m2、m3和m5三個數的最小者。
前面我們分析的時候,提到把已有的每個醜數分別都乘以2、3和5,事實上是不需要的,因為已有的醜數是按順序存在陣列中的。對乘以2而言,肯定存在某乙個醜數t2,排在它之前的每乙個醜數乘以2得到的結果都會小於已有最大的醜數,在它之後的每乙個醜數乘以2得到的結果都會太大。我們只需要記下這個醜數的位置,同時每次生成新的醜數的時候,去更新這個t2。對乘以3和5而言,存在著同樣的t3和t5。
**:
import time
def finduglynum2():
t = time.clock()
uglynum = [1]
n = int(input())
i = 1
t2 = m2 = 0
t3 = m3 = 0
t5 = m5 = 0
while i < n:
for x in range(t2, len(uglynum)):
m2 = uglynum[x]*2
# print("m2:",m2,end=" ")
if m2 > uglynum[-1]:
t2 = x
# print("t2:",t2)
break
for x in range(t3, len(uglynum)):
m3 = uglynum[x]*3
# print("m3:",m3,end=" ")
if m3 > uglynum[-1]:
t3 = x
# print("t3:",t3)
break
for x in range(t5, len(uglynum)):
m5 = uglynum[x]*5
# print("m5",m5,end=" ")
if m5 > uglynum[-1]:
t5 = x
# print("t5:",t5)
break
i += 1
print(uglynum)
# 測試
finduglynum2()
計算前1000個醜數,耗時2.34秒。執行結果圖。
劍指offer 醜數 Python 實現
題目描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。解題思路 按照醜數的大小乙個個的插入醜數,這樣可以以o n 的時間複雜度實現。設定3個指標pos 2,pos 3...
刷題 醜數 python
題目 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 所有醜數可以通過前面的醜數乘2 3 5得到,主要是要知道如何將這些數從小到大排序,以確定排在第n個位置的醜數。...
劍指Offer 33 醜數(Python實現)
把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。解法一 迴圈法 coding utf 8 class solution def getuglynumber solutio...