求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,不能输出,后面所有数字也是如此。
                    
                
                
            
        
浙公网安备 33010602011771号