[projectEuler.net]12
生活随笔
收集整理的這篇文章主要介紹了
[projectEuler.net]12
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
求一個數的因子的數量。 X=a^n*b^m*c^p will have (n + 1)(m + 1)(p + 1) factors.//abc都是質因子28=2^2*7 will have 3*2 = 6 factors 因為:? 28的質因子是 2 2 7?; 28的所有因子必是由這些質因子構成; 構造這些因子時:2可以取 0 、1、 2 個。7可以取0 、1 個; 所以28因子的數量是:3×2=6 。
import Data.Numbers.Primes
import Data.List
(|>) f g =(g)$(f)
zipSame' ::[Integer]->[[Integer]]->[[Integer]]
zipSame' [] rs=rs
zipSame' (x:xs) rs'@((r:rs):rss) =
if x == r then zipSame' xs ((x:r:rs):rss)
else zipSame' xs ([x]:rs')
--zipSame 假設相同的元素是連續的。因為primes函數產生的素數是排好序的
zipSame :: [Integer]->[[Integer]]
zipSame (x:xs) =zipSame' xs [[x]]
zipSame [] = [[0]]
--mapCount目的是求出嵌套的list中子list的長度,以[數量]形式返回
--e.g.[[2,2,2]] >> [3]
mapCount ::[[Integer]]->[Integer]
--zipSame 假設相同的元素是連續的。因為primes函數產生的素數是排好序的mapCount xs =
mapCount xs =
map (\ a -> toInteger $ length a) xs
--計算給定數的因子的數量
factorsCount :: Integer ->Integer
factorsCount x =
(mapCount $ zipSame $ primeFactors x)
|> foldl (\ sum x -> sum*(x+1) ) 1
triangleNumbers::[Integer]
triangleNumbers =
let x =[1..] in
map (\ a ->truncate $ fromInteger ((1+a)*a) / fromInteger 2 ) x
tfc =
map (\ i-> (i,factorsCount i)) triangleNumbers
fstOverfc::[(Integer,Integer)]->(Integer,Integer)
fstOverfc (x:[]) =x
fstOverfc (x@(i,fc):xs)
| fc >=500 = x
| otherwise =fstOverfc xs
http://mathforum.org/library/drmath/view/55843.html
http://www.cnblogs.com/zhouyinhui/archive/2011/02/16/1955691.html
題目要求找到第一個因子數大于500的triangle number(簡寫tn) (第i的tn 就是 1+2+3+...+i)
尷尬的是一開始審題不認真,以為要找到一個因子是等于500的,因為因子是不按一定的規律,比如找6個因子的數很快就是28,但是(隨便說的數字)找7個因子的數可能結果是99999 ?雖然因子數差1但是實際數字跨越可能很大。
haskell實現:
使用了Data.Numbers.Primes庫?
module P12 whereimport Data.Numbers.Primes
import Data.List
(|>) f g =(g)$(f)
zipSame' ::[Integer]->[[Integer]]->[[Integer]]
zipSame' [] rs=rs
zipSame' (x:xs) rs'@((r:rs):rss) =
if x == r then zipSame' xs ((x:r:rs):rss)
else zipSame' xs ([x]:rs')
--zipSame 假設相同的元素是連續的。因為primes函數產生的素數是排好序的
zipSame :: [Integer]->[[Integer]]
zipSame (x:xs) =zipSame' xs [[x]]
zipSame [] = [[0]]
--mapCount目的是求出嵌套的list中子list的長度,以[數量]形式返回
--e.g.[[2,2,2]] >> [3]
mapCount ::[[Integer]]->[Integer]
--zipSame 假設相同的元素是連續的。因為primes函數產生的素數是排好序的mapCount xs =
mapCount xs =
map (\ a -> toInteger $ length a) xs
--計算給定數的因子的數量
factorsCount :: Integer ->Integer
factorsCount x =
(mapCount $ zipSame $ primeFactors x)
|> foldl (\ sum x -> sum*(x+1) ) 1
triangleNumbers::[Integer]
triangleNumbers =
let x =[1..] in
map (\ a ->truncate $ fromInteger ((1+a)*a) / fromInteger 2 ) x
tfc =
map (\ i-> (i,factorsCount i)) triangleNumbers
fstOverfc::[(Integer,Integer)]->(Integer,Integer)
fstOverfc (x:[]) =x
fstOverfc (x@(i,fc):xs)
| fc >=500 = x
| otherwise =fstOverfc xs
轉載于:https://www.cnblogs.com/jiangzhen/archive/2012/01/31/2332529.html
總結
以上是生活随笔為你收集整理的[projectEuler.net]12的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纹理滤波(Texture Filter)
- 下一篇: 路要怎么走?关于程序员成长的一点思考