【发布时间】:2013-02-14 15:58:59
【问题描述】:
我正在尝试制定最快的算法来确定一个数字是否为素数。 我对从 3 到 100,000 的每个数字执行此操作。
for(int i = 3; i < 100000; i += 1)
if(isPrime(i))
System.out.println(i);
这需要 0.52 秒。 我的朋友建议不要迭代偶数:
for(int i = 3; i < 100000; i += 2)
if(isPrime(i))
System.out.println(i);
它需要 0.53 秒(可能是随机差异)。
为什么他的建议不减少运行时间? 如果我迭代更少的数字,我希望程序运行得更快。
isPrime() 的代码:
public static boolean isPrime(int n)
{
if((n % 2 == 0 && n != 2) || (n % 3 == 0 && n != 3)|| (n % 5 == 0 && n != 5))
return false;
for(int i = 5; i < n / 5; i += 2)
{
if(n % i == 0)
return false;
}
return true;
}
【问题讨论】:
-
用seiving找到sqrt(MAX_INPUT)的素数,并测试从2到sqrt(MAX_INPUT)的所有素数。但是,如果您要在一个很大的范围内搜索素数,那么只需搜索到 MAX_INPUT。
-
@nhahtdh 我知道那个解决方案,但我可以问一下它为什么有用吗?
-
@shohamh:它做的工作更少,这就是它更快的原因。 (这里只讨论算法。在这种情况下,打印可能比算法本身花费更多的时间)。
-
@RudolphEst:这些天测试 100000 个数字已经不算什么了。写入控制台是一个更大的问题......