我是Haskell的全新手,一般编程,但我正在尝试解决一些Project Euler问题,因为我喜欢解决问题。但是,我遇到了problem #12的问题。
我设计了一个我认为可行的解决方案,但唉,事实并非如此。
你能用我的代码睁开眼睛来解决问题吗? 并且可能会把我推向正确的方向来修复它?谢谢。
以下是代码:
triangleNumber = scanl1 (+) [1..]
factors n = [x | x <- [1..n], n `mod` x == 0]
numFactors = length . factors
eulerTwelve = find ((>500) . numFactors) triangleNumber
非常感谢! :)
答案 0 :(得分:3)
Project Euler问题的设计是为了尝试通过“强力”来解决它们,也就是说,通过编程明显的搜索并让它继续运行是一个坏主意。 (有些早期的问题可以像这样解决,但最好不要利用它,而是将它们用作练习。)相反,你必须考虑问题的数学内容,以便进行计算机搜索。容易处理。
我不想放弃太多,但这里有一些提示:
n 三角形数的公式。找到它,所以你不必通过求和来计算它。
鉴于 n 三角形数的这个公式,它的除数可能是多少?
鉴于你对这些除数的了解,有什么方法可以找出它们中有多少? (无需枚举它们。)
答案 1 :(得分:2)
我复制了它,它扔给我的是一个无法找到的错误。那是因为您需要导入find所在的模块List:
import Data.List
顺便说一下,你应该优化你的因子功能。
答案 2 :(得分:1)
我认为你提到的问题是eulerTwelve
花了太长时间终止;你的代码是正确的,它只是效率低下。瓶颈是您的factors
函数,该函数会尝试介于1和n
之间的每个数字,以查看它是否为n
的除数。这是使用efficient prime factorization和a nifty implementation of the power set找到数字除数的更快捷方式:
import Data.Numbers.Primes (primeFactors)
powerSet = filterM (const [True, False])
factors = map product . nub . powerSet . primeFactors
即使这样效率也很低;您可以直接从numFactors
计算primeFactors
,如下所示:
numFactors = product . map ((+1) . length) . group . primeFactors
当我用这个替换numFactors
时,我立即获得结果。
答案 3 :(得分:0)