[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 。

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 where

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



原文地址:https://www.cnblogs.com/jiangzhen/p/2332529.html