用java写个程序判断 用户输入的数 是否是质数?

用java写个程序判断 用户输入的数 是否是质数?,第1张

使用java编写判断自然数是否为素数的方式是,使用scanner来接受用户输入的数值,使用素数的算法,实例如下:

Scanner sr = new Scanner(System.in)

    System.out.print("请输入a的值:")

    脊烂int a = sr.nextInt()

    boolean is = true

    if (a < 1)

    {

      System.out.println(a + "不是质数,因为他小于一")

    }

    else

    {

      List<Integer> list = new ArrayList<Integer>()

      for (int i = 2 i < a i++)

      {

        if (a % i != 1 && a % i != a)

    燃卖    {

          if (a % i == 0){

            is=false

            list.add(i)

          }

        }

      }

      if(is){

        System.out.println("a是质数")

      }else{

        String yz=""

        for (int i = 0 i < list.size() i++)

        {

          if (yz=="")

          {

            yz=yz+list.get(i)

     樱段漏     }else{

            yz=yz+","+list.get(i)

          }

        }

        System.out.println("a不是质数,因为他含有因子"+yz)

      }

    }

我写了几种方法,并逐步优化,并且对每一种方法进行了1000000次的调用测试每种方法的速度,仅供参考:

import java.math.BigInteger

public class Test_04 {

    /**

     * 最笨重的一种方法,用该整数分别除以比它小的数,看是否能被整除

     */

    public boolean isPrimeNum_1(int num) {

        // 识别小于2的数

        if (num < 2) {

            return false

        }

        for (int i = 2 i < num i++) {

            if (num % i == 0) {

                return false

            }

        }

        return true

    }

    /**

     * 优化第一种方法<br>

     * 1、偶数不可能是质数<br>

     * 2、对于大于2的数,如果一个数a大于数b的一半,那么b不可能被a整除

   含悄薯  */

    public boolean isPrimeNum_2(int num) {

        // 2特殊处理

        if (num == 2) {

            return true

        }

        // 识别小于2的数和偶数

        if (num < 2 || num % 2 == 0) {

            return false

        }

        int max = num / 2

        for (int i = 3 i < max i += 2) 谈者{

            if (num % i == 0) {

                return false

            }

        }

        return true

    }

    /**

     * 在第二种方法上再次优化,利用数字的性质:<br>

     * 一个数不是素数就是合数,那么一定可以由两个自然数相乘得到,其中一个大于或等于它的平方根,<br>

     * 一个小于或等于它的平方根,并且成对出现。<br>

     * 这样就可以把计算量大幅度减少

     */

    public boolean isPrimeNum_3(int num) {

        if (num == 2) {

            return true// 2特殊处理

        }

        if (num < 2 || num % 2 == 0) {

            return false// 识别小于2的数和偶数

        }

        double sqrt = Math.sqrt(num)

        for (int i = 3 i <= sqrt i += 2) {

            if (num % i == 0) {

                return false

            }

        }

        return true

    }

    /**

     * Java中的BigInteger中已经写好了一个判断是否为质数的方法,直接用就可以了

     */

    public boolean isPrimeNum_4(int num) {

        BigInteger integer = BigInteger.valueOf(num)

        return integer.isProbablePrime(1)

    }

    public static void main(String[] args) {

        Test_04 test_04 = new Test_04()

        int num = 991

        System.out.println(test_04.isPrimeNum_1(num))

        long startTime = System.currentTimeMillis()

        for (int i = 0 i < 1000000 i++) {

            test_04.isPrimeNum_1(num)

        }

        long endTime = System.currentTimeMillis()

        System.out.println("第一种方法运行时间:" + (endTime - startTime) + "ms")

        System.out.println(test_04.isPrimeNum_2(num))

        startTime = System.currentTimeMillis()

        for (int i = 0 i < 运绝1000000 i++) {

            test_04.isPrimeNum_2(num)

        }

        endTime = System.currentTimeMillis()

        System.out.println("第二种方法运行时间:" + (endTime - startTime) + "ms")

        System.out.println(test_04.isPrimeNum_3(num))

        startTime = System.currentTimeMillis()

        for (int i = 0 i < 1000000 i++) {

            test_04.isPrimeNum_3(num)

        }

        endTime = System.currentTimeMillis()

        System.out.println("第三种方法运行时间:" + (endTime - startTime) + "ms")

        System.out.println(test_04.isPrimeNum_4(num))

        startTime = System.currentTimeMillis()

        for (int i = 0 i < 1000000 i++) {

            test_04.isPrimeNum_4(num)

        }

        endTime = System.currentTimeMillis()

        System.out.println("第四种方法运行时间:" + (endTime - startTime) + "ms")

    }

}

输出结果:

true

第一种方法运行时间:2732ms

true

第二种方法运行时间:671ms

true

第三种方法运行时间:68ms

true

第四种方法运行时间:1064ms


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12473664.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存