醜數 python實現

2021-08-08 23:12:44 字數 2412 閱讀 7177

筆試的時候遇到這個題,當時沒做出來。

參考資料:大佬傳送門,傳送門二。

題目:我們把只包含因子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...