【问题标题】:Printing sum of non abundant numbers in haskell在haskell中打印非丰富数字的总和
【发布时间】:2017-08-06 05:00:51
【问题描述】:

这是一个欧拉计划问题 23:非丰富的和。

完美数是一个数,它的真因数之和正好等于这个数。例如,28 的因数之和为 1 + 2 + 4 + 7 + 14 = 28,这意味着 28 是一个完美数。

如果一个数 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 的新手。请帮我解决错误。

【问题讨论】:

  • 请在您的问题正文中输入文本。许多人和所有搜索引擎都无法访问文本图像。
  • 如果您遇到错误发布其文本(post,post);如果您遇到错误发布其文本(帖子,帖子);如果您遇到错误,并且没有更清楚的说明,如果您遇到错误,请发布其文本。始终在您的问题中添加错误消息。否则就像要求没有代码的代码审查一样。
  • 请添加其余必要的文字并删除图像,这将是不必要的。

标签: list haskell


【解决方案1】:

你有两个问题。一个主要是数学的,一个主要是关于 Haskell 语义的。两者都源于缺乏关心和思路清晰;您应该更加仔细和缓慢地考虑如何编写一个工作量较少的程序来获得答案。我不会写下任何解决方案或正确的版本(事实上,Euler 项目不鼓励分享解决方案),因为这对您没有帮助,也不会帮助任何通过 google 遇到此问题的人。

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&gt;=28124,但您永远不会转到下一个x 值。事实上,所有值都被拒绝,因为1 并不丰富。尝试将[1..] 更改为[1..n],其中n 是您应该决定的。或者,将其更改为一个数量丰富的列表,直到某个限制。参见takeWhilefilter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2011-03-27
    • 2020-12-18
    • 2011-07-31
    相关资源
    最近更新 更多