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));
    }
}
优缺点
  • 优点:
    • 实现简单,容易理解。
  • 缺点:
    • 效率较低,时间复杂度为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));
    }
}
优缺点
  • 优点:
    • 比简单遍历法效率更高,因为避免了偶数的判断。
  • 缺点:
    • 仍然有一定的时间复杂度,不适用于极大数判断。

方法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));
    }
}
优缺点
  • 优点:
    • 效率较高,时间复杂度为O(n log log n)。
  • 缺点:
    • 需要额外的空间来存储标记,空间复杂度较高。

总结与推荐

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高大人在上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值