以下是输出0~100000内质数的代码(带计时):
class PrimeNumberTest {
public static void main(String[] args) {
boolean isFlag = true; //标识i是否被j除尽,一旦除尽,修改其值
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
//遍历100000以内的自然数
for(int i = 2;i <= 100000;i++){
for(int j = 2;j < i;j++){
if(i % j == 0){ //i被j除尽
isFlag = false;
}
}
if(isFlag == true){
System.out.println(i);
}
//重置isFlag
isFlag = true;
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
System.out.println("所花费的时间为:" + (end - start));
}
}
输出结果:
我们发现下面语句执行时,只要判断出第一个可以除尽的数就跳出循环,可以节省时间。
if(i % j == 0){
isFlag = false;
}
改写为:
if(i % j == 0){
isFlag = false;
break;
}
输出结果如下:
运行时间大大减少了,从7958ms减少到了1160ms!
我们又考虑到判断m是否为质数只用判断到 为止,又可以对下面语句进行优化
for(int j = 2;j < i;j++){
if(i % j == 0){
isFlag = false;
break;
}
改写为:
for(int j = 2;j <= Math.sqrt(i);j++){
if(i % j == 0){
isFlag = false;
break;
}
输出结果如下:
运行时间再次大大减少,从1160ms减少到了433ms
考虑到433ms的运行时间大部分都用在输出数字身上,我们如果只需求1~100000内质数的个数的话,可以再次优化代码
重新定义一个变量count,来记录质数的个数就行,取消输出质数的操作,改完后整体代码如下:
class PrimeNumber {
public static void main(String[] args) {
boolean isFlag = true;
int count = 0;
long start = System.currentTimeMillis();
for(int i = 2;i <= 100000;i++){
for(int j = 2;j <= Math.sqrt(i);j++){
if(i % j == 0){
isFlag = false;
break;
}
}
if(isFlag == true){
count++;
}
isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("所花费的时间为:" + (end - start));
}
}
输出结果如下:
最后运行时间来到了惊人的6ms!!
从中我们可以发现,在写代码的过程中要多思考如何简化自己的代码,书写不同,执行效率有着天差地别!从7928ms到6ms,效率提升1000多倍!