• JAVA经典百题之判断质数


    题目:判断一个数字是否为质数。

    程序分析

    判断一个数字是否为质数,需要检查该数字是否能被除了1和它本身之外的其他整数整除。如果能被整除,那么它不是质数。否则,它是质数。

    方法1:简单遍历法

    解题思路

    从2开始遍历到该数字的平方根,检查是否能整除该数字。

    实现代码
    public class PrimeNumberChecker {
    
        public static boolean isPrimeSimple(int num) {
            if (num < 2)
                return false;
    
            int sqrtNum = (int) Math.sqrt(num);
    
            for (int i = 2; i <= sqrtNum; i++) {
                if (num % i == 0)
                    return false;
            }
    
            return true;
        }
    
        public static void main(String[] args) {
            int num = 23;  // Example number to check for primality
            System.out.println("Is " + num + " a prime number? " + isPrimeSimple(num));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    优缺点
    • 优点:
      • 实现简单,容易理解。
    • 缺点:
      • 效率较低,时间复杂度为O(√n),可能不适用于大数判断。

    方法2:优化遍历法

    解题思路

    在简单遍历法的基础上,可以进行一些优化。只需要遍历到该数字的平方根,同时每次遍历加2(因为偶数除了2都不是质数)。

    实现代码
    public class PrimeNumberChecker {
    
        public static boolean isPrimeOptimized(int num) {
            if (num < 2)
                return false;
            if (num == 2)
                return true;
            if (num % 2 == 0)
                return false;
    
            int sqrtNum = (int) Math.sqrt(num);
    
            for (int i = 3; i <= sqrtNum; i += 2) {
                if (num % i == 0)
                    return false;
            }
    
            return true;
        }
    
        public static void main(String[] args) {
            int num = 23;  // Example number to check for primality
            System.out.println("Is " + num + " a prime number? " + isPrimeOptimized(num));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    优缺点
    • 优点:
      • 比简单遍历法效率更高,因为避免了偶数的判断。
    • 缺点:
      • 仍然有一定的时间复杂度,不适用于极大数判断。

    方法3:埃拉托斯特尼筛法(Sieve of Eratosthenes)

    解题思路

    该方法利用了质数的特性:所有的非质数都可以分解为质数的乘积。从小到大逐步筛选掉非质数,直到剩下的数字即为质数。

    实现代码
    public class PrimeNumberChecker {
    
        public static boolean isPrimeEratosthenes(int num) {
            if (num < 2)
                return false;
    
            // Create a boolean array to mark if a number is prime
            boolean[] primeFlags = new boolean[num + 1];
            Arrays.fill(primeFlags, true);  // Assume all numbers are prime initially
            primeFlags[0] = primeFlags[1] = false;  // 0 and 1 are not prime
    
            // Apply Sieve of Eratosthenes algorithm
            for (int i = 2; i * i <= num; i++) {
                if (primeFlags[i]) {
                    for (int j = i * i; j <= num; j += i) {
                        primeFlags[j] = false;  // Mark multiples of prime numbers as non-prime
                    }
                }
            }
    
            return primeFlags[num];
        }
    
        public static void main(String[] args) {
            int num = 23;  // Example number to check for primality
            System.out.println("Is " + num + " a prime number? " + isPrimeEratosthenes(num));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    优缺点
    • 优点:
      • 效率较高,时间复杂度为O(n log log n)。
    • 缺点:
      • 需要额外的空间来存储标记,空间复杂度较高。

    总结与推荐

    • 方法1(简单遍历法)是最简单直接的实现,但效率较低,不适用于大数判断。
    • 方法2(优化遍历法)在简单遍历法的基础上进行了优化,效率较高,但仍然有一定的时间复杂度。
    • 方法3(埃拉托斯特尼筛法)效率最高,适用于较大数判断,但需要额外的空间。

    推荐使用方法3(埃拉托斯特尼筛法)作为最优方法,尤其对于大数判断,它能提供较高的效率。如果对空间复杂度有较高要求,可以根据具体情况选择方法2(优化遍历法)。方法1(简单遍历法)在效率上不如方法2和方法3,不推荐在实际应用中使用。

  • 相关阅读:
    P1966 [NOIP2013 提高组] 火柴排队
    DyGRAIN: An Incremental Learning Framework for Dynamic Graphs
    iMazing苹果用户手机备份工具 兼容最新的iOS16操作系统
    20220726NOI模拟赛--考后总结
    每日5题Day14 - LeetCode 66 - 70
    延时队列java
    解决5053无法安装驱动的故障
    开学季征文 | 一位开发实习生的真情流露
    MacOS13-将数据库转为markdown,docx格式
    gerapy下载和安装以及部署全流程
  • 原文地址:https://blog.csdn.net/2302_79769114/article/details/133611770