欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求[0, N)的素数个数

程序员文章站 2024-03-14 21:03:26
...

0,1不算,2算

解题思路:

  • 最简单的是暴力求解,两次循环
  • 埃式筛选法,使用一个数组作为标记数组。默认全部为素数(此方法必须保证首个数字是质数,即从2开始)
/**
 * 统计N以内的素数[0, N)
 * 解题思路:暴力求解(很多场景都可以用暴力求解,但是并不优雅);艾塞法
 */
public class Src02 {
    public static void main(String[] args) {
        System.out.println(bf(12));
        System.out.println(screening(12));
    }

    // 暴力求解
    public static int bf(int N) {
        int count = 0;
        for (int i = 2; i < N; i++) {
            if(isPrime(i)) {
                count++;
            }
        }
        return count;
    }

    // 判断是否为素数
    public static boolean isPrime(int n) {
        for (int i = 2; i * i <= n; i++) {  // 必须是 <=
            if(n % i == 0) {
                return false;
            }
        }
        return true;
    }

    // 埃筛法 利用和数必然存在一组[2,n]的数,相乘等于n
    public static int screening(int n) {
        boolean[] list = new boolean[n];    // 默认false;这里使用false表示素数
        int count = 0;
        for(int i = 2; i < n; i++) {    // 遍历 [2~n)
            if(!list[i]) {  // 从2开始乘以一个数
                count++;
                for (int j = i * i; j < n; j += i) {    // 条件比较巧妙
                    list[j] = true;
                }
            }
        }
        return count;
    }
}
相关标签: Java 算法