2012-09-04 22 views
0

這是我的一門課程的作業編程問題。我幾年沒有編程,而且我從一開始就不太好。我目前正在通過教程來加快速度,但這需要一些時間。如果你們能幫我解決這個問題,我會非常感激。按升序排列並且沒有重複的沒有2,3或5以外的主要因素的正整數列表

約束:

這個序列的每一項都是形式2^i*3^j*5^k的正整數,對於所有非負整數i, j, and ki + j + k >= 1.

不能使用數組。解決這個問題的算法必須涉及列表的重複創建和合並。具體爲5 lists; a final list, temp list, and three term lists。 「

」最終列表通過與當前臨時列表合併而增長,臨時列表反過來被三個術語列表的合併替代,新術語列表通過將新的臨時列表乘以2, 3, and 5 respectively

所需的序列會去如下:2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, . . .

+12

你到目前爲止做了什麼?告訴我們你的努力。 – kosa

+0

查看:http://stackoverflow.com/questions/7215315/find-the-kth-least-number-for-expression-2x3y5z – hammar

+0

@Nambari到目前爲止,我只有基本的概念。我實際上並沒有開始編寫程序,因爲我已經熟悉了所有的java語法。我相信我必須做的是創建一個臨時的整數列表1-n。然後我將該列表乘以2,並將結果存儲在另一個列表中,我們稱它爲L2。除了將溫度列表乘以三,並將其稱爲L3之外,我會這樣做。最後用5來完成,並調用列表L5。然後我想我會使用合併排序算法並將結果存儲到Lfinal中,並將其打印出來。 – JessieM

回答

1

正如你在你的問題已經解釋了,你可以做你的算法遞歸。

在步驟N:

的最終列表將代表該組F(n) = {m | m = 2^i*3^j*5^k, 1<=i+j+k<=n}

的臨時列表將表示該集合T(n) = {m | m = 2^i*3^j*5^k, i+j+k=n}

然後, 「L2」 術語列表將是L2(n) = 2*T(n-1)

「L3」術語列表將爲L3(n) = 3*T(n-1)

在「L5」一詞名單將L5(n) = 5*T(n-1)

爲了得到T,T(n) = merge(L2(n), L3(n), L5(n))

要獲得男,F(n) = merge(F(n-1), T(n))

一旦你得到了這一點,你必須實現的功能合併2名列表。在主函數中,你只需要在Java中翻譯它們。

您還可以使列表始終排序,以便合併既簡單又高效!在Java中,我認爲你可以使用LinkedList或ArrayList,兩者都可以正常工作。

畢竟,這是你的功課。

+0

我有一個嘮叨懷疑你的算法應該(非常)效率低下,但我確定它是不正確的:'F(n)'將會在最後出現漏洞。例如,'F(1)'包含5個,但缺少4個。但是洞的起始位置很難說。 –

+0

經典Haskell版本'hh = 1:union(map(2 *)hh)(union(map(3 *)hh)(map(5 *)hh))'獲得第100,000,000個漢明數字,在0.14秒電腦。您的版本在大約2.5秒內無法知道使用哪個'n',因此'F(n)[100000]'是正確的(140個作品,但120個沒有)。你的版本的代碼:''ttNext xs = map(2 *)xs'union'map(3 *)xs'union'map(5 *)xs; tt1 = [1]; tt = iterate ttNext tt1; ff = scanl union [] tt''(我使用特殊的'union'函數,線性用於合併有序列表,刪除重複項)。 –

相關問題