« 平方根の求め方 その2 〜 今度は Haskell で | トップページ | Haskell で行列の計算をしてみる »

2011年2月 6日 (日)

Project Euler : Problem 58

 問題はこちらをご覧ください。
 また、自作の "ForEuler module" に関してはこちらをご覧ください。

 

 辺の長さと四隅の数の関係を調べてみると、次のようなことが分ります。

辺の長さ : 四隅の数 : 交差 1 : 1 : 0 3 : 9, 7, 5, 3 : -2 5 : 25, 21, 17, 13 : -4 7 : 49, 43, 37, 31 : -6
 つまり四隅の数は、辺の長さを L とすると「初項 L^2, 公差 1-L の等差数列」と見ることができます。
 ということで次のようなコードを書いてみました。
import ForEuler (isPrime) problem058 :: Integer problem058 = head [s | (s, _, _) <- dropWhile check $ tail ts] where ts = scanl f (1, 0, 1) [3, 5 ..] check (_, p, t) = 10 * p >= t f (_, p, t) s = (s, p + length (pNums s), t + 4) pNums x = filter isPrime [x ^ 2 + (1 - x) * y | y <- [0 .. 3]] main :: IO () main = print problem058
 対角線上の数の個数の合計を t 、そのうちの素数の個数の合計を p とした時、dropWhile に与える条件を「p / t >= 0.1」とすると、計算の度に数値の型を Int から Float に変換しなければいけません。
 そこで条件式を変形して「10 * p >= t」とすることで Int だけで計算できるようにしてみました。

« 平方根の求め方 その2 〜 今度は Haskell で | トップページ | Haskell で行列の計算をしてみる »

Haskell」カテゴリの記事

Project Euler」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/50788729

この記事へのトラックバック一覧です: Project Euler : Problem 58:

« 平方根の求め方 その2 〜 今度は Haskell で | トップページ | Haskell で行列の計算をしてみる »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ