4
import Data.Set

euler :: Int
euler = sum [ x | x <- nums ]
    where
    nums = Data.Set.toList (Data.Set.union (Data.Set.fromList [3,6..999])
                                           (Data.Set.fromList [5,10..999]))

私は Haskell を学んでいます。3 または 5 の倍数である 1000 未満のすべての自然数を保持するリストを取得するより良い方法はありますか? (例: zip や map を使用しますか?)

編集:

import Data.List

euler :: Int
euler = sum (union [3,6..999] [5,10..999])

助けてくれてありがとう、みんな。

4

7 に答える 7

15

リスト内包表記を使用する:

sum [x | x <- [1..999], x `mod` 3 == 0 || x `mod` 5 == 0]
于 2012-08-16T07:35:22.553 に答える
10

ハードコードされたバージョンも使用できます。

sum $ [3, 6 .. 999] ++ [5, 10 .. 999] ++ [-15, -30 .. -999]
于 2012-08-16T11:01:21.920 に答える
8

これにより、要求したリストが表示されます。

filter (\x -> (x `mod` 3 == 0) || (x `mod` 5 == 0)) [1..999]
于 2012-08-16T07:37:29.957 に答える
5

これが1つです。

mults35 = union [3,6..999] [5,10..999]
  where
    union (x:xs) (y:ys) = case (compare x y) of 
       LT -> x : union  xs  (y:ys)
       EQ -> x : union  xs     ys 
       GT -> y : union (x:xs)  ys
    union  xs     []    = xs
    union  []     ys    = ys

効率の悪い別の方法を次に示します。

import Data.List

nub . sort $ ([3,6..999] ++ [5,10..999])

(インポート ステートメントがある場合は、完全修飾名を使用する必要はありません)。

また興味深いのは、3 と 5だけの倍数を見つけることです。

m35 = 1 : (map (3*) m35 `union` map (5*) m35)
于 2012-08-16T07:38:22.657 に答える
2
sum [x | x <- [1..999], let m k = (x`mod`k==0), m 3 || m 5]
于 2012-08-16T22:36:21.957 に答える
1

これが超高速の1つです。10 億を超える値で試してみてください。

eu x = sum[div (n*(p*(p+1))) 2 | n<-[3,5,-15], let p = div (x-1) n]

もっと短縮できると思います。

于 2013-01-31T06:39:28.550 に答える
1

3 と 5 だけでなく、数字のリストに対するより一般的な解決策:

addMultiples :: [Int] ->  Int -> Int
addMultiples multiplesOf upTo = sum[n | n <- [1..upTo-1], or (map ((0==) . mod n) multiplesOf)]
于 2012-12-17T23:03:24.323 に答える