求100以内的质数(素数)

 

题目如上,不过这里还有两种优化方式,为了看出不同方式的执行速度,调用了 system 类的方法,同时也将求100以内的质数改为求5000以内。

分析:质数就是除了 1 和它本身,不能被其它任何数整除的数。我们很容易想到应该考虑 2 到 这个数减一的范围,这也就是最初的写法。优化一和优化二也写在里面了,为什么不分开写呢?因为我懒 因为我喜欢!

public class PrimeNumber_right {
   
   public static void main(String[] args) {

long start = System.currentTimeMillis();
//定义flag,标识i是否被j除尽,一旦除尽,flag变为false
boolean flag = true;
for(int i = 2;i <= 50000;i++) {//遍历100以内的数

// for(int j = 2;j <= i-1 ;j++) {//让j被i除(i/j)
for(int j = 2;j <= Math.sqrt(i) ;j++) { //优化二:对本身是质数的自然数有效
if(i % j == 0) {
flag = false;
break;//优化一:只对本身不是质数的自然数有效
}
}
if(flag == true) {
System.out.println(i);
}
//重置flag
flag = true;
}

long end = System.currentTimeMillis();
// System.out.println("花费时间:"+(end - start));//3968毫秒。加break后:431毫秒
System.out.println("花费时间:"+(end - start));//改为开方后:44毫秒
}
}

其中碰到的问题以及一点想法

为什么会想到用flag?

因为判断这个数是不是质数,我们应该把需要比较的数比较完,也就是一次比较不能得出结果,而比较的结果就是true、false,很适合用一个变量flag来表示。

同时很重要的一点是,每次比较完应该重置这个flag,因为在 i = 4的时候,flag 会变为 false(进入了内层循环的if),此时不输出。当 i = 5,是质数,但此时 flag 还是 false,不能输出,后面所有数字也是如此。



posted @ 2020-07-07 15:14  飞鸟与鱼  阅读(707)  评论(0)    收藏  举报