第一种方法:
long start = System.currentTimeMillis(); //用于记录开始前的时间,和程序结束后的时间比较得出运行时间
boolean flag = true; //用于标识当前自然数是否是质数
for(int i = 2; i < 100000; i++)
{
for(int j = 2; j < i; j++) //将循环结束条件改为i的开方
{
if(i % j == 0) //有数能除尽,将flag置为false,表示当前的i不是质数
{
flag = false;
}
}
if(flag == true)
{
System.out.println(i);
}
flag = true;
}
long end = System.currentTimeMillis(); //用于记录程序结束的时间
System.out.println("当前程序执行的总时间为:"+ (end - start)); //单位是毫秒
运行结果如下:查找100000以内的质数花费的时间是12682ms
优化:
①将内层循环的结束条件改为范围的开方
②在判断出当前自然数非质数之后跳出内层循环
long start = System.currentTimeMillis(); //用于记录开始前的时间,和程序结束后的时间比较得出运行时间
boolean flag = true; //用于标识当前自然数是否是质数
for(int i = 2; i < 100000; i++)
{
for(int j = 2; j <= Math.sqrt(i); j++) //将循环结束条件改为i的开方
{
if(i % j == 0) //有数能除尽,将flag置为false,表示当前的i不是质数
{
flag = false;
break; //判断出当前自然数不是质数就跳出内层循环,避免不必要的运算
}
}
if(flag == true)
{
System.out.println(i);
}
flag = true;
}
long end = System.currentTimeMillis(); //用于记录程序结束的时间
System.out.println("当前程序执行的总时间为:"+ (end - start)); //单位是毫秒
运行结果:查找100000以内的质数花费时间是62ms,运行速度有相当明显的提升
第二种:使用label来标记外层循环
long start = System.currentTimeMillis(); //用于记录开始前的时间,和程序结束后的时间比较得出运行时间
label:for(int i = 2; i < 100000; i++) //使用label进行标识当前循环
{
for(int j = 2; j <= Math.sqrt(i); j++)
{
if(i % j == 0)
{
continue label; //有数能除尽,非质数,跳出label标记的外层循环的此次判断,进行下一个数的判断
}
}
System.out.println(i);
}
long end = System.currentTimeMillis(); //用于记录程序结束的时间
System.out.println("当前程序执行的总时间为:"+ (end - start)); //单位是毫秒
运行结果:运行时间为54ms,和优化后的第一种方法相差不大,但是代码要简洁点