2014-11-22 92 views
0

我感到厭惡,我卡住了,我真的不能包住我的腦袋周圍什麼是錯的。問題讀取。項目歐拉在F#8#

查找1000位數字中具有最大產品的13個相鄰數字。這個產品的價值是什麼?

現在我將數字存儲爲一個字符串,我只取數字,循環並將每個13位數的「substring」作爲一個數組,並將它們相乘並進行比較。現在我已經驗證了我只能得到一個1000位數的char數組,我已經驗證了我得到了75個相同大小的char數組。但我沒有得到正確的答案。

下面是代碼

let problem8() = 
    let str = @"731671765313306..." 
       |> Seq.filter (Char.IsDigit) 
       |> Seq.toArray 

    (* We only need to go to 987 because 1000 isn't divisble by 13 and if we were to take the last 11 digits from 987 
     we would end up with 0 anyhow. *) 
    seq { for i in 0.. 13 ..987 -> str.[i..i + 12] } 
    |> Seq.map (Seq.fold (fun acc chr -> acc * int64 (Char.GetNumericValue(chr))) 1L) 
    |> Seq.max 

problem8() 
|> printfn "%d" 
+0

對於'123456'中的4位數字,您應該使用'3456',而不是使用'1234'停止。 – raina77ow 2014-11-22 21:51:21

回答

1

如果在該序列表達式中使用0 .. 13 .. 987,那麼你分割這樣的陣列(爲簡單起見,使用在10個數字3大小的塊):

[012][345][678]9 

我想,這個問題要你去尋找所有可能的子串,即

[012][345][678]9 
0[123][456][789] 
01[234][567]89 

因此,您可能需要使用0 .. 987來嘗試所有索引。

順便說一下,我懷疑使用int64 c - 48L將char轉換爲int64會更快。

+0

這樣做,感謝您的快速幫助! – 2014-11-22 22:03:18

+0

該轉換如何工作? 「48L」是什麼意思? – 2014-11-22 22:07:26

+1

'48L = int64'0'' :-)並且表示數字的字符彼此相連,即'int64'1'= 49L'等。 – 2014-11-22 22:10:43