Problem 3
module Problem_0003 (* 【問題】 13195 の素因数は 5、7、13、29 である。 600851475143 の素因数のうち最大のものを求めよ。 *) /// 素因数分解関数 let pf num = let rec pfRT list num p = if p <= num then if num % p = 0M then pfRT (p :: list) (num / p) p else pfRT list num (p + 1M) else list pfRT [] num 2M let run () = pf 600851475143M
書き直したパターン
let pf zero inc init num = let rec check (p,n) = if n < p then None elif n % p = zero then Some(p, (p, n/p)) else check(p+inc, n) Seq.unfold check ((*素数*)init, (*現在の数字*)num) let run() = pf 0M 1M 2M 600851475143M |> Seq.toList
■計算式ビルダ
使い方覚えるために書いた物なので、正直意味のないコード
module Problem_0003_Monado (* 【問題】 13195 の素因数は 5、7、13、29 である。 600851475143 の素因数のうち最大のものを求めよ。 A. 6857 *) type PrimeEnumeratorBuilder() = let rec check (p,n) = if n < p then None elif n%p=0I then Some(p,(p,(n/p))) else check(p+1I,n) member this.Bind(v,f)= f <| Seq.unfold check (2I,v) member this.Return v = v |> Seq.toList let pe = PrimeEnumeratorBuilder() let run() = pe { let! s = 600851475143I return s }
-
- -