考虑这个计算数字因子的F#代码:
let n = 340339004337I
// A sequence of all factors:
let factors = seq { 1I .. n / 2I} |> Seq.filter (fun x -> n % x = 0I)
// Pull off the first factor from the sequence:
let factor =
if factors = seq [] then
n
else
factors |> Seq.nth 0
Run Code Online (Sandbox Code Playgroud)
换句话说,如果factors是空的,那么返回n.否则,从中拉出第一个元素factors.我们的目标是占1和之间的所有因素(N/2) ,和Ñ本身自1和Ñ总是因素Ñ.
该factors = seq []测试是行不通的.我通过看这个来达到这个语法:
> seq {1 .. …Run Code Online (Sandbox Code Playgroud) 考虑这个F#代码,将下面的数字相加i为3和5的倍数:
let isMultipleOfThreeOrFive n =
(n % 3 = 0) || (n % 5 = 0)
let sequenceOfMultiples i =
seq {1 .. i - 1} |> Seq.filter isMultipleOfThreeOrFive
Run Code Online (Sandbox Code Playgroud)
因为i是int,如果i很大,你会溢出.这个版本BigInteger负责:
let isMultipleOfThreeOrFive n =
(n % 3I = 0I) || (n % 5I = 0I)
let sequenceOfMultiples (i : System.Numerics.BigInteger) =
seq {1I .. i - 1I} |> Seq.filter isMultipleOfThreeOrFive
Run Code Online (Sandbox Code Playgroud)
要将int版本转换为版本BigInteger,我必须I在数字后添加许多s.这是因为F#不进行隐式转换.
有没有一种简单的方法来解决这个问题,或者I在6个地方添加s是最好的办法?
f# ×2