zoukankan      html  css  js  c++  java
  • Java求100以内的质数的四种方法

    质数:

    • 又称素数,只能被1和它本身整除的数就是质数。

    难点:

    • 需要两层循环,外层循环99遍;
    • 内层循环,控制除数为2到98(也就是2到被除数前面的一个数)。
    • 为什么从2开始?因为所有数都能被1整除。
    • 需要定义一个变量flag来记录某个数是不是质数
    • 内层循环结束后需要重新把flag重置为true

    方法一:

    import org.junit.Test;
    
    public class Demo {
    
        @Test
        public void primeNumberTest() {
    
            boolean flag = true;
    
            for (int i = 2; i <= 100; i++) {
                for (int j = 2; j < i; j++) {
                    if (i % j == 0) {
                    //为什么要定义变量flag?
                    //因为只能被1和它本身整除的才是质数,而如果if的判断条件为true
                    //则这个数不是质数。因为进入if判断条件,意味着这个数能被2到i-1的某个数整除
                        flag = false;
                    }
                }
                if (flag) {
                    System.out.print(i+",");
                }
            //因为内层循环会把flag的值设置为false
            //如果没有下面的语句,flag的值在进入内层循环之后将永远为false
                flag = true;
            }
        }
    }

    结果:

    2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,

    方法二:

    与方法一相比有所改进的地方,把flag放在外层与内层循环之间,这样就不用每次结束内层循环后去重置flag的值。

    import org.junit.Test;
    
    public class Demo {
    
        @Test
        public void primeNumberTest() {
    
            for (int i = 2; i <= 100; i++) {
            //因为flag定义在外层循环与内层循环之间,所以每次开始外层循环时flag的值都是true
            //这样就不需要在内层循环结束时重置flag的值为true了    
                boolean flag = true;
                for (int j = 2; j < i; j++) {
                    if (i % j == 0) {
                        //为什么要定义变量flag?
                        //因为只能被1和它本身整除的才是质数,而如果if的判断条件为true
                        //则这个数不是质数。因为进入if判断条件,意味着这个数能被2到i-1的某个数整除
                        flag = false;
                    }
                }
                if (flag) {
                    System.out.print(i + ",");
                }
            }
        }
    }

    结果

    2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,

    方法三:

    改进:在if判断语句后面加了break,因为只要有能被2到i-1当中的一个数整除,这个i就不是质数,就没有必要继续循环下去
    import org.junit.Test;
    
    public class Demo {
    
        @Test
        public void primeNumberTest() {
            
            System.out.println(start);
            for (int i = 2; i <= 10000; i++) {
                boolean flag = true;
                for (int j = 2; j <i; j++) {
                    if (i % j == 0) {
                        flag = false;
                        break;//这是改进的地方,因为只要有能被2到i-1当中的一个数整除,这个i就不是质数,就没有必要继续循环下去
                    }
                }
                if (flag) {
                    System.out.print(i+",");
                }
    
            }
        }
    }

    方法四:

    改进:把j的取值范围由<i,改为<=Math.sqrt(i)

    import org.junit.Test;
    
    public class Demo {
    
        @Test
        public void primeNumberTest() {
    
           
            for (int i = 2; i <= 100; i++) {
                boolean flag = true;
                for (int j = 2; j <= Math.sqrt(i); j++) {
                    if (i % j == 0) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    System.out.print(i + ",");
                }
    
            }
        }
    }

    方法四的小改进:

    加了一个count,去统计质数的个数

    import org.junit.Test;
    
    public class Demo {
    
        @Test
        public void primeNumberTest() {
    
            int count=0;
            for (int i = 2; i <= 100; i++) {
                boolean flag = true;
                for (int j = 2; j <= Math.sqrt(i); j++) {
                    if (i % j == 0) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    System.out.print(i + ",");
                    count++;
                }
            }
            System.out.print("质数个数为:"+count);
        }
    }

    结果:

    2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,质数个数为:25

    后记:

    2020年3月3日 09:45AM 星期二 农历2020年二月初十 上海 晴 温度:12°,比较冷。

  • 相关阅读:
    基数排序
    定时任务
    线程池的创建
    SharePoint 客户端对象模型 多选查阅项赋值
    Sharepoint Rest 根据user获取UserId
    SHAREPOINT
    plupload 实例
    JS 在web页面中调用本地应用程序
    Jquery ajax上传文件到服务器
    sharepoint 人员选择控件使用
  • 原文地址:https://www.cnblogs.com/majestyking/p/12400606.html
Copyright © 2011-2022 走看看