| Михаил Ильин ( @ 2008-06-22 15:32:00 |
немного самолюбования
По наводке
_denplusplus_ начал решать задачки в Project Euler. С моими "знаниями" математики для меня там даже тривиальные задачи интересны, а на Haskell их делать одно удовольствие.
Например под катом функция разложения числа на простые множители. По ходу научился пользоваться unfoldr и вспомнил из школы слова "решето Эратосфена" (хотя и не уверен, что вспомнил правильно, но все вроде работает как надо)
По наводке
Например под катом функция разложения числа на простые множители. По ходу научился пользоваться unfoldr и вспомнил из школы слова "решето Эратосфена" (хотя и не уверен, что вспомнил правильно, но все вроде работает как надо)
import Data.List
import Data.Maybe
divisors n ms = filter (\m -> (n `mod` m)==0) ms
primes = 2:3:unfoldr (\currprimes@(n:_) -> let nextprime = fromJust $ find (\x->(divisors x currprimes)==[]) [n+2..]
in Just (nextprime,nextprime:currprimes) ) [3,2]
primeFactors n = case divisors n $ takeWhile (<=n) $ primes of
p:_ -> p : primeFactors (n `div` p)
[] -> []Syhi-подсветка кода
import Data.Maybe
divisors n ms = filter (\m -> (n `mod` m)==0) ms
primes = 2:3:unfoldr (\currprimes@(n:_) -> let nextprime = fromJust $ find (\x->(divisors x currprimes)==[]) [n+2..]
in Just (nextprime,nextprime:currprimes) ) [3,2]
primeFactors n = case divisors n $ takeWhile (<=n) $ primes of
p:_ -> p : primeFactors (n `div` p)
[] -> []Syhi-подсветка кода