面试题关于质数的求法
100以内的所有质数的输出:
质数:素数,只能被1和他本身整除的自然数–>从2开始到这个数-1为止,都不能被这个数本身整除。代码如下:
class PrimeNumberTest {
public static void main(String[] args) {
boolean isFlag = true;//定义一个Flag,表示i是否被j除尽,一旦除尽,修改其值
for (int i = 2; i <= 100 ; i++ ){//从2开始遍历100以内的自然数
for (int j = 2; j < i ; j++ ){//j被i去除
if (i % j == 0){//i被j除尽
isFlag = false;
}
}
if (isFlag == true){
System.out.println(i);
}
isFlag = true;//重置isFlag
}
}
}
这种代码很明显就是提前声明了一个 isFlag = true;这一句是重点也是代码的关键,for的2层嵌套循环并不能有效的判断出该数字是否为质数,加入这条代码,让其能够完美的判断了这个数是否为质数,因为除了能被整除的数剩下的肯定是质数啊。如果觉得这种方法抽象,可以把整个过程想象成医院检查身体的过程,从1号到n号(穿着true的白衣服,等待医生的审判)排着队伍,轮流进去被医生检查,如果发现你不是质数,那么医生就会在你的白衣服上写一个大大的 “×” 号,出来的时候有会有检票员把你的衣服收掉去掉 “×” 号重新给下个人穿,这就是为什么最后一句要重新赋值, 使isFlag = true的原因,这样就会不断的进行判断,最终找到n个数之内的所有质数了是不是很简单呢。
这种方法是最基本的方法之一,因为这种求质数的方法在求很大的一个范围之内的数的时间复杂度会很高,所以我在后面改进了代码后,可以明显看出改进后的效率是大幅度上升了一个档次。下面是我第一次改进后的代码:
/*
100000以内的所有质数的输出--->优化方式2
质数:素数,只能被1和他本身整除的自然数-->从2开始到这个数-1为止,都不能被这个数本身整除
对PrimeNumberTest质数输出问题的一个优化
*/
class PrimeNumberTest2 {
public static void main(String[] args) {
//获取当前时间距离1970-01-01 00.00.00的毫秒数
long start = System.currentTimeMillis();
int count = 0;
Lable:for (int i = 2; i <= 100000 ; i++ ){//从2开始遍历100000以内的自然数
//优化2:Math.sqrt()调用数学函数开方,对本身是质数的自然数是有效的
for (int j = 2; j <= Math.sqrt(i) ; j++ ){//j被i去除
if (i % j == 0){//i被j除尽
continue Lable;
}
}
//能执行到此步骤的都是质数。
count++;
}
//获取当前时间距离1970-01-01 00.00.00的毫秒数
long end = System.currentTimeMillis();
System.out.println("所有质数的个数为:" + count);
System.out.println("所花费的时间为:" + (end - start));//35690 --->优化一后:3040 ---> 优化二后:1174
}
}
这次的改进使得代码的时间复杂度降低了很多,因为去记录一下时间的大小,所以我选择了100000这个数,可以很明显的看出时间的改变。最后,给一下我的最终版本的代码,也是我最喜欢的版本之一,收藏哦记得~~
/*
100000以内的所有质数的输出--->优化方式2
质数:素数,只能被1和他本身整除的自然数-->从2开始到这个数-1为止,都不能被这个数本身整除
对PrimeNumberTest质数输出问题的一个优化
最终版本:使用了continue的方法完美的解决了质数的问题。
*/
class PrimeNumberTest2 {
public static void main(String[] args) {
//获取当前时间距离1970-01-01 00.00.00的毫秒数
long start = System.currentTimeMillis();
int count = 0;
Lable:for (int i = 2; i <= 100000 ; i++ ){//从2开始遍历100000以内的自然数
//优化2:Math.sqrt()调用数学函数开方,对本身是质数的自然数是有效的
for (int j = 2; j <= Math.sqrt(i) ; j++ ){//j被i去除
if (i % j == 0){//i被j除尽
continue Lable;
}
}
//能执行到此步骤的都是质数。
count++;
}
//获取当前时间距离1970-01-01 00.00.00的毫秒数
long end = System.currentTimeMillis();
System.out.println("所有质数的个数为:" + count);
System.out.println("所花费的时间为:" + (end - start));//35690 --->优化一后:3040 ---> 优化二后:1174
}
}