package test;
public class PrimeNumber {
//输出100000以内的质数的个数
public static void main(String[] args) {
int number=0;
int count=0;
long start=System.currentTimeMillis();//程序开始时当前时间;
for(int i=2;i<=100000;i++){//遍历100000以内的自然数;
for (int j=2;j<i;j++){//遍历从2到i-1的数;
if(i%j==0){//质数换句话说就是从2到i-1都没有i的约数;
number++;
}
}
if(number==0){
count++;//每满足质数的条件就记一个数;
}
number=0;//重置number;
}
long end=System.currentTimeMillis();//结束时当前时间;
System.out.println("100000以内的质数个数为:"+count);
System.out.println("程序花费时间为:"+(end-start));
}
}
运行结果为:
这里用时16秒多,用时还是比较多的。我们看看算法二
(二)算法二:代码如下
package test;
public class PrimeNumber {
//输出100000以内的质数的个数
public static void main(String[] args) {
int number=0;
int count=0;
long start=System.currentTimeMillis();//程序开始时当前时间;
for(int i=2;i<=100000;i++){//遍历100000以内的自然数;
for (int j=2;j<i;j++){//遍历从2到i-1的数;
if(i%j==0){//质数换句话说就是从2到i-1都没有i的约数;
number++;
break;//只要遇到有约数就停止,没有必要把从2到小于该数的整数都算一遍
}
}
if(number==0){
count++;//每满足质数的条件就记一个数;
}
number=0;//重置number;
}
long end=System.currentTimeMillis();//结束时当前时间;
System.out.println("100000以内的质数个数为:"+count);
System.out.println("程序花费时间为:"+(end-start));
}
}
运行结果如下:
在number++后加了break,程序花费时间就少了很多,这里只用了1秒多。
(三)算法三:
package test;
public class PrimeNumber {
//输出100000以内的质数的个数
public static void main(String[] args) {
int number=0;
int count=0;
long start=System.currentTimeMillis();//程序开始时当前时间;
for(int i=2;i<=100000;i++){//遍历100000以内的自然数;
for (int j=2;j<=Math.sqrt(i);j++){//遍历从2到i-1的数;
if(i%j==0){//质数换句话说就是从2到i-1都没有i的约数;
number++;
break;//只要遇到有约数就停止,没有必要把从2到小于该数的整数都算一遍
}
}
if(number==0){
count++;//每满足质数的条件就记一个数;
}
number=0;//重置number;
}
long end=System.currentTimeMillis();//结束时当前时间;
System.out.println("100000以内的质数个数为:"+count);
System.out.println("程序花费时间为:"+(end-start));
}
}