エラトステネスの篩を酒のんだ勢いで書いたら汚くなった
タイトルの通りです。
汚いしなんか遅い気がするのでそのうち誰かに見てもらおうかな・・・
なんでこんなの書いたかというとProjectEulerで使う機会がありそうだったからです。
でもintでいいのかは疑問。
let eratosthenes number = let rec del_list x list list'= match list with | [] -> list' | hd::rest -> if (hd mod x) = 0 then del_list x rest list' else del_list x rest (list'@[hd]) in let makelist num = let rec sub_makelist num l = match num with | 2 -> 2::l | num -> sub_makelist (num-1) (num::l) in sub_makelist num [] in let rec sub_eratosthenes numlist primelist = match numlist with | [] -> primelist | x::rest -> let numlist' = (del_list x numlist []) in let primelist' = (primelist@[x]) in if x * x > (List.hd (List.rev numlist)) then (primelist @ numlist) else sub_eratosthenes numlist' primelist' in sub_eratosthenes (makelist number) [];;