java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java判断素数

Java中判断一个数是否为素数(质数)的方法实例

作者:阳雨i

在Java编程语言中判断一个整数是否为质数是一个常见的数学问题,也是计算机科学基础课程中的典型示例,这篇文章主要介绍了Java中判断一个数是否为素数(质数)的相关资料,需要的朋友可以参考下

素数的定义

素数是指大于1的自然数,除了1和它本身外,没有其他正因数。换句话说,素数只能被1和它自身整除。

素数的例子

常见的素数包括2、3、5、7、11、13等。2是唯一的偶数素数,其他偶数(如4、6、8等)均不是素数,因为它们可以被2整除。

素数的性质

判断素数的方法

试除法:根据上面对素数性质的理解,我们可以联想到最简单的判断方式,就是一个数,从1开始往后一个数一个数的去做除法,直到它本身,如果都没有能被除尽(没有余数),则这个数就是素数

public static boolean isPrime(int n) {//n表示传入需要判断的数
    if (n <= 1) {//如果小于1不是素数,直接返回
        return false;
    }
    for (int i = 2; i < n; i++) {//从除数2开始往后除,一直到n本身
        if (n % i == 0) {//如果n能被i整除(无余数),则这个数不是素数
            return false;
        }
    }
    //当所有的数字都除完了,没有一个i能整除n,则是素数
    return true;
}
 

通过上面的代码可以做到素数的判断,但是这样的判断效率非常的慢,如果需要判断的素数非常的大,一个一个的从1开始除,则需要浪费很多时间,我们可以引入一个变量count来计数一下,总共

进行了多少次循环

public static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    int count = 0;  // 初始化计数器
    for (int i = 2; i < n; i++) {
        count++;     // 每次循环递增计数器
        if (n % i == 0) {
            System.out.println("count: " + count);  // 输出循环次数
            return false;
        }
    }
    System.out.println("count: " + count);  // 输出循环次数
    return true;
}
 

例如我们需要判断52087这个数字是否为素数,可以看到count如下:

count: 50285

可以看到需要循环的次数非常的多,那么我们有没有可以进行优化的方法呢?

有的兄弟,有的

方法优化

上述方法可以进一步优化,减少循环次数:

public static boolean isPrime(int n) {
        int count = 0;
        for (int i = 2; i <= Math.sqrt(n) ; i++) {//Math.sqrt(n)指的是n开根号
            count++;
            if (n % i == 0) {
                return false;
            }
        }
        System.out.println(count);
        return true;

在这个方法中,我们可以看到在for循环中除数的结束循环发生了变化,在上一个方法中结束的条件是循环到判断数n本身的位置,在这个方法中则是变成了√n,这个怎么去理解呢?

我们可以观察上图,四个数中的因子,都是成对出现的,我们以36为例子,36的平方根是6

我们可以发现,左边绿色部分的数,都是小于平方根的,右边蓝色部分的数都是大于平方根的,平方根把因子平均分为了两组,且两组都是一一对应的,那我们就可以只需要看一边就能判断这个数是否为素数了,不需要再去看大的数目了,所以这时候循环结束条件的最大值就可以定为√n,直接省略掉了一半需要判断的数目,提高了效率

需要注意的是此处的判断条件从变成了<=,因为我们还需要判断平方根本身

通过上述方法,便可以轻松的判断一个数是否为素数啦

当然还有更进一步的优化

进一步优化:跳过偶数

除2外,素数均为奇数,所以因子就不会有偶数了,可跳过偶数除数。

public static boolean isPrime(int n) {
    if (n <= 1) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    for (int i = 3; i <= Math.sqrt(n); i += 2) {//每次+2,跳过除数为偶数的判断
        if (n % i == 0) return false;
    }
    return true;
}
 

效果:循环次数再减半。

总结

到此这篇关于Java中判断一个数是否为素数(质数)的文章就介绍到这了,更多相关Java判断素数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文