2014-11-22 76 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