求素数&素数筛

求素数

public class Main {
    public static void main(String[] args) {

        for (int i = 2; i < 1000; i++) {
            if (isSimple(i)){
                System.out.println(i);
            }
        }
    }

    public static boolean isSimple(int num){
        boolean flag = false;
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if(num%i==0){
                return false;
            }
        }
        return true;
    }
}

素数筛

1.埃及筛的时间复杂度

public static void main(String[] args) {
      isPrime
        int MAX_NUM = 100; //前多少个元素的个数
        boolean[] isPrime = new boolean[MAX_NUM + 1];  //isPrime数组是用来存储素数情况,isPrime[i]为0,则表示i为素数
        初始情况下全部为0,开始假设所有数都是素数
        for (int i = 2; i <= MAX_NUM; i++) {   //每次将一个素数的所有倍数标记为非素数
            if (isPrime[i] == false) {
                for (int j = i * 2; j < MAX_NUM; j+=i) {
                    isPrime[j] = true;
                }
            }
        }

        for (int i = 2; i < isPrime.length-1; i++) {
            if(isPrime[i]==false){
                System.out.println(i);
            }
        }
    }

2.欧拉筛,也叫线性筛

package reflex;

import java.util.Scanner;

public class Euler {

static int N = (int) 1e6;      //可以满足输入的最大数字  最大数字1e9
static boolean[] st = new boolean[N];  //记录的输入数字之前的素数和合数的情况,初始化默认是false,代指质数
static int[] primes = new int[N];  //将所有的素数存入该列表
static int k = 0;

public static void getPrimes() {
    欧拉筛
    for (int i = 2; i < N; i++) {
        if (!st[i]) {
            primes[k++] = i;
        }
        for (int j = 0; primes[j] * i < N; j++) {  //2,3,5,7.....
            //每个合数 只被最小的质因子筛掉  如8是被i=4时,被2筛掉
            st[i * primes[j]] = true;
            // 1.若i%primes[j]!=0,i中的最小质因子都是比primes[j]大,i*primes[j]这个数的最小质因子
            // 2.若i%primes[j]==0,primes[j]是i的最小质因子,i*primes[j]的最小质因子
            if (i % primes[j] == 0) break; //已经是最小质因子筛掉了,所以退出
        }
    }
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    getPrimes();
    while (scanner.hasNext()) {
        int cnt = 0;
        // 统计质数的次数
        int n = scanner.nextInt();
        
        for (int i = 0; i < k && primes[i] < n; i++) {
            while (n % primes[i] == 0) {
                cnt++;
                n = n / primes[i];
            }
        }
        if (n > 1) cnt++;
        System.out.println(cnt);
    }
    scanner.close();
}

}

参考:https://zhuanlan.zhihu.com/p/100051075
https://www.bilibili.com/video/BV1nF411a7DF?from=search&seid=13183924924456838690&spm_id_from=333.337.0.0

作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   Chenyi_li  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示