在haskell中打印非丰富数字的总和

时间:2017-08-06 05:00:51

标签: list haskell

这是项目欧拉问题23:非丰富的总和。

  

完美数字是一个数字,其正确除数的总和恰好等于数字。例如,28的适当除数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完美数。

     

如果n的适当除数之和小于n,则n被称为不足,如果该和超过n则称为n。

     

由于12是最小的有限数,1 + 2 + 3 + 4 + 6 = 16,可以写成两个有限数之和的最小数是24.通过数学分析,可以看出所有大于28123的整数可以写成两个数字的总和。然而,即使知道不能表示为两个丰富数字之和的最大数量小于该限制,也不能通过分析进一步降低该上限。

     

找出所有正整数的总和,这些正整数不能写成两个数字的总和。

这里sumOfPD函数返回适当除数的总和。

我编写了以下不起作用的代码。

sumOfPD :: Integral a => a -> a 
sumOfPD x = sum([y | y <- [1..x], rem x y == 0]) - x

main = do
 print (sum ([x + y | x <- [1..], y <- [1..], x + y < 28124, sumOfPD x <= x, sumOfPD y <= y]))

我是Haskell的新手。请帮我解决错误。

1 个答案:

答案 0 :(得分:1)

你有两个问题。一个主要是数学的,一个主要是关于Haskell语义。两者都源于缺乏关心和思想清晰;你应该更仔细地考虑如何编写一个程序,这个程序可以减少工作量来得到答案。我不会写下任何解决方案或正确的版本(确实项目Euler不鼓励共享解决方案),因为这对你没有帮助,并且它不会帮助任何通过谷歌遇到这个问题的人。

main中的总和中,您多次计算一些数字。例如$ 1 + 2 + 4 + 5 + 10 = 21> 20 $所以20是丰富的。您的清单包括$ 32 = 12 + 20 = 20 + 12 $至少两次。注意[32,32] /= [32]。另请注意,这不仅仅是计算$ x + y $和$ y + x $的问题,可能有一些数字是两个(非平凡)不同方式中两个模糊的总和。

由于Haskell中列表推导的性质,在main中,x只会考虑1的值,因为所考虑的值为(x,y)=(1,1),(1,2),(1,3),(1,4),...,然后每个这些值的测试。有一点之后,所有值都会被拒绝为x+y>=28124,但您永远不会转到下一个x值。事实上,所有价值都被拒绝,因为1并不充裕。尝试将[1..]更改为[1..n],其中n是您应该决定的事项。或者,将其更改为包含大量限制的大量数字列表。 Cf takeWhilefilter