【发布时间】:2013-06-01 22:08:25
【问题描述】:
这是对欧拉计划任务 #3 的剧透!如果你想自己解决,请不要继续阅读。
我正在尝试通过为 Project Euler 编写程序来学习 Haskell。目前我正在尝试解决任务 #3,它要求数字 600851475143 的最大素数。
为此,我创建了一个列表liste,其中包含所有数字,这些数字是该数字的除数(直到其平方根)。我现在的策略是,计算这些数字的除数,以确定它们是否为素数。
number = 600851475143
-- sn = sqrt number
sn = 775146
liste = [x | x <- [1..sn], (mod number x == 0)]
-- liste = [1,71,839,1471,6857,59569,104441,486847]
primelist :: Int -> [Int]
primelist z = [y | y <- [1..z], mod z y == 0]
main = print [primelist x | x <- liste]
应该出现在这里的结果应该是一个包含 8 个列表的列表,其中包含 liste 元素的除数。相反,列表
[[1],[1,3],[1,29],[1,3,29,87]]
被打印出来了。
如何解释这种行为?
【问题讨论】:
-
我收到
[[1],[1,71],[1,839],[1,1471],[1,6857],[1,71,839,59569],[1,71,1471,104441],[1,71,6857,486847]](GHCi 7.6.3,Linux 64 位) -
这很有趣......目前我正在使用 ideone,因为我在 Windows 上。那么这对他们来说似乎是一个问题。
-
可能
Int溢出。请改用Integer。 (我只是在验证溢出假设。)是的,这正是我将Int32与该代码一起使用的结果。 -
删除类型声明更正了代码。谢谢大家!
标签: haskell