素数算法

素数算法

package com.jmmq.load.jim.algorithm;

/**
 * 是否是素数算法
 *    如果n不是素数, 则n有一个因子d满足1< d <=sqrt(n)
 *   素数又叫质数,质数是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。
 *  参考文档:
 *  https://www.zifangsky.cn/89.html
 *  https://blog.youkuaiyun.com/program_think/article/details/7032600
 */
public class PrimeNumberPrc {

    public static void main(String[] args) {

    }

    /**
     *
     * @param x  要测试的数据
     * @return
     * 穷举 - 效率最低🤢
     */
    public static boolean testPrimeNumber(int x){

        // 大于1的自然数
        if(x < 2){
            return false;
        }

        for(int i = 2; i < x; i++ ){
            if(x%i == 0){
                return false;
            }
        }
        return true;
    }

    /**
     * @param x
     * @return
     */
    public static boolean testPrimeNumber1(int x){

        // 小于1 && 能被2整除都不是素数(专业里面2其实也是素数。就不补充进来了主要是看思路)
        if(x < 2 || x%2 == 0 ){
            return false;
        }

        //  可分解因式都是成对出现,
        //  一个在 √x 前一个在 √x后,因此循环的时候只需要循环到 √x即可
        //  这里从3开始循环,因为上面过滤掉了所有偶数,所以步长就是2

        for(int i = 3; i*i <= x; i = i+2){
            // 这里还可以把 x%i == 0 的时候缓存下 x/i的值。
            // 这样后面循环的时候判断如果是缓存中的倍数则直接就跳过,这里不写了
            if(x%i == 0){
                return false;
            }
        }
        return  true;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值