定义
质数:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
定义倒是很简单,但是仔细想想难度还是有的,首先代码实现一下
代码实现
这里给的是10W的数量级
public class PrimeNumberTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
int count = 0;
for(int i = 2;i <= 100000;i++){
boolean isFlag = true;
//for(int j = 2;j < i;j++){
for(int j = 2;j < i;j++){
if(i % j == 0){
isFlag = false;
}
}
if(isFlag){
//输出质数
//System.out.println(i);
count++;
}
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
System.out.println("质数个数为"+count);
System.out.println("所花费的时间为:" + (end - start));
}
}
运行结果:
质数个数为9592
所花费的时间为:16922
在此代码上优化一下,如果if(i % j == 0)
触发到条件后,那么可以在代码里面加入break提前结束循环。
再次进行测试:
质数个数为9592
所花费的时间为:1635
可以看出代码已经有了很大的优化,
j < i
的判断范围缩小到 i 的平方根 ,即j < Math.sqrt(i)
测试:
质数个数为9657
所花费的时间为:25
最终代码:
public class PrimeNumberTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
int count = 0;
for(int i = 2;i <= 100000;i++){
boolean isFlag = true;
//for(int j = 2;j < i;j++){
for(int j = 2;j < Math.sqrt(i);j++){
if(i % j == 0){
isFlag = false;
break;
}
}
if(isFlag){
//System.out.println(i);
count++;
}
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
System.out.println("质数个数为"+count);
System.out.println("所花费的时间为:" + (end - start));
}
}