--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2007/11/23

友愛数

wikipedia - 友愛数

Haskell で練習がてら書いてみた。かなり遅い。原因も分かってはいるが、腕不足で直せない。

divisors n = [x | x <- [1..n `div` (if odd n then 3 else 2)], n `mod` x == 0]

sumDivisors = sum . divisors

getAmicable n | and [(n == m'), (n /= m)] = (n,m) -- 完全数ではない
             | otherwise                 = (-1,-1)
             where
                m  = sumDivisors n
                m' = sumDivisors m

isAmicable (n,m) | and [(n == -1),(m == -1)]   = False
                | otherwise                   = True

swapNub [] = []
swapNub (x:xs) = x : swapNub (filter (((/=) (fst x)) . snd) xs)

main = putStrLn $ show $ swapNub $ filter isAmicable [getAmicable n |
n <- [1..10000]]
-- [(220,284),(1184,1210),(2620,2924),(5020,5564),(6232,6368)]

できなかったこと

  • 一度求めた値のキャッシュ
  • 重複する値を求めない

もっと別のアプローチがあるんでしょう。関数の合成についてはかなり理解が深まった。

スポンサーサイト

comment

post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。