帮助我找到Haskell中Project Euler#12解决方案的问题

时间:2011-01-22 22:37:08

标签: algorithm haskell math

我是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 

非常感谢! :)

4 个答案:

答案 0 :(得分:3)

Project Euler问题的设计是为了尝试通过“强力”来解决它们,也就是说,通过编程明显的搜索并让它继续运行是一个坏主意。 (有些早期的问题可以像这样解决,但最好不要利用它,而是将它们用作练习。)相反,你必须考虑问题的数学内容,以便进行计算机搜索。容易处理。

我不想放弃太多,但这里有一些提示:

  • n 三角形数的公式。找到它,所以你不必通过求和来计算它。

  • 鉴于 n 三角形数的这个公式,它的除数可能是多少?

  • 鉴于你对这些除数的了解,有什么方法可以找出它们中有多少? (无需枚举它们。)

答案 1 :(得分:2)

我复制了它,它扔给我的是一个无法找到的错误。那是因为您需要导入find所在的模块List:

import Data.List

顺便说一下,你应该优化你的因子功能。

答案 2 :(得分:1)

我认为你提到的问题是eulerTwelve花了太长时间终止;你的代码是正确的,它只是效率低下。瓶颈是您的factors函数,该函数会尝试介于1和n之间的每个数字,以查看它是否为n的除数。这是使用efficient prime factorizationa 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)

IIRC在检查您不需要测试1和n之间的每个整数的因子时 - 只有1和n ^ 0.5之间的数字(n的平方根),因为在此数字处您已经获得了所有可用的因子