Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 在F中投影Euler#8#_F# - Fatal编程技术网

F# 在F中投影Euler#8#

F# 在F中投影Euler#8#,f#,F#,我很沮丧,我被困住了,我真的不知道怎么回事。问题是 在1000位数字中找到具有最大乘积的十三个相邻数字。这个产品的价值是什么 现在我将数字存储为一个字符串,只提取数字,循环并获取每个13位“子字符串”作为数组,将它们相乘并比较。现在我已经验证了我只得到了一个1000位的字符数组,我已经验证了我得到的正好是75个大小相等的字符数组。但我没有得到正确的答案 这是密码 let problem8() = let str = @"731671765313306..."

我很沮丧,我被困住了,我真的不知道怎么回事。问题是

在1000位数字中找到具有最大乘积的十三个相邻数字。这个产品的价值是什么

现在我将数字存储为一个字符串,只提取数字,循环并获取每个13位“子字符串”作为数组,将它们相乘并比较。现在我已经验证了我只得到了一个1000位的字符数组,我已经验证了我得到的正好是75个大小相等的字符数组。但我没有得到正确的答案

这是密码

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。。13 .. 987
在序列表达式中,然后按如下方式对数组进行分区(为简单起见,使用10位中的3个大小的块):

我想这个问题需要你寻找所有可能的子字符串,即

[012][345][678]9
0[123][456][789]
01[234][567]89
因此,您可能需要使用
0尝试所有索引。。987


顺便说一句,我怀疑使用
int64 c-48L

将字符转换为
int64
会更快。对于
123456
中的4位数字,您应该使用
3456
,而不是停止使用
1234
48L=int64'0'
:-)并且表示数字的字符彼此紧跟,即
int64'1'=49L
等。
[012][345][678]9
0[123][456][789]
01[234][567]89