回归自然!-算法问题大挑战 寻找质数
让我们暂时忘了EJB,STRUTS,Web Service这种虚妄的大东西吧!让我们挑战一下计算的本质!
要求:
给出一个程序用于寻找质数。尽可能优化程序,使得计算速度更快。
我先抛砖引玉,给出一个最直接的算法。此算法只有最起码的优化。
/**
* 寻找用户给定的两个整数之间所有的质数。命令行:java PrimeLister [下限] [上限]
*
* @author Alienbat
*
*/
public class PrimeLister
{
public static void main(String[] args)
{
long startValue = 1;
long endValue = -1;
if (args.length == 0 || args.length > 2)
{
System.out.println("[start value] [end value(optical)]");
return;
}
else if (args.length == 1)
{
startValue = Long.parseLong(args[0]);
System.out.println(
"start value: " + startValue + ", no end value!");
}
else if (args.length == 2)
{
startValue = Long.parseLong(args[0]);
System.out.println("start value: " + startValue);
endValue = Long.parseLong(args[1]);
System.out.println("end value: " + endValue);
}
long num = startValue;
if (num % 2 == 0)
{
num++;
}
//---------------------------------以上是读取用户输入数字的部分
//---------------------------------以下是计算并显示质数的部分
while (endValue < 0 || num < endValue)
{
for (long i = 3; i < num; i = i + 2)
{
if (num % i == 0)
{
break;
}
else if (i == (num - 2))
{
System.out.println(num);
}
}
//只计算奇数
num = num + 2;
//去除尾数为5的数
if (num % 5 == 0)
{
continue;
}
}
}
}
简单的优化有:
只检测一个奇数是否是质数。忽略偶数。
忽略尾数为5的数。(因为尾数为5则肯定能被5整除)。
-----------------------------
期望大家贴出更有效的算法。Don't let me down!