【发布时间】:2011-02-13 11:17:13
【问题描述】:
我有这段代码可以检查给定的数字是否是素数:
If x Mod 2 = 0 Then
Return False
End If
For i = 3 To x / 2 + 1 Step 2
If x Mod i = 0 Then
Return False
End If
Next
Return True
我只将它用于数字1E7 <= x <= 2E7。但是,它非常慢 - 我几乎无法每秒检查 300 个数字,因此检查所有 x 需要超过 23 天...
有人可以提供一些改进提示或说出我可能会以这种方式多余地做些什么吗?
【问题讨论】:
-
一开始,您只需要测试到
sqrt(x),而不是x/2+1。 -
会更快吗?我猜
sqrt(x)需要更多时间来计算。 -
i只需要一直到sqrt(x)(注意你只需要计算一次平方根,而不是循环的每次迭代,这样会更快),而不是x / 2.这应该可以让您更快地测试该范围,但更快的是 Eratosthenes 的筛子。 -
第一行有错误 - 你写的是
i而不是x -
刚刚编辑过 - 对不起。