统计素数 [暴力BP、埃筛法]

在这里插入图片描述

解法1:暴力法(BP)

public class leetcode1 {
    public static void main(String[] args) {
        bp(10000);
    }

    //使用暴力法,因为0和1规定不是素数也不是,所以从2开始
    public static void bp(int n){
        int count=0;
        for (int  i= 2; i <= n; i++) {
            count+=isPrime(i)? 1: 0;
        }
        System.out.println(count);
    }

		//这里i*i<x的意思,是因为i要小于根号x,因为例如12=3*4  和4*3重复了一次
    private static boolean isPrime(int x) {
        for (int i = 2; i*i <= x; i++) {
            if (x % i ==0){
                return false;
            }
        }
        return true;
    }
}

解法2:埃筛法

解法1时间复杂度太大了,面试还是得用解法二

思路:使用标记位标记合数(非素数)

什么是埃式筛选:简单来说 就是把素数的倍数筛选出去 比如2式素数 2的倍数都不是素数 2 4 6 8 或者 23=6 24=8 等等
直接去掉 这要就不用重复查找了
参考:https://blog.csdn.net/weixin_52514567/article/details/115917341

public class leetcode4 {
    public static void main(String[] args) {
        System.out.println(countPrime(100));

    }

    public static int countPrime(int n){
        boolean[] notIsPrime=new boolean[n]; //false表示是素数,创建时默认是false
        int count=0;
        for (int i = 2; i < n; i++) {
            if (!notIsPrime[i]){
                count++;
                //埃筛法就是这样从一个数开始一直乘,标记是合数的
                //j就是合数的标记位
                //这里 j+=i 意思是 不断地 j=(j++)*i的意思
                //这里j=2*i可以改为j=i*i,因为也是类似上面解法1的,他们有重复统计的
                for (int j = 2*i ; j < n; j+=i) {
                    notIsPrime[j]=true;
                }
            }
        }
        return count;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值