zoukankan      html  css  js  c++  java
  • 素数模版

    欧拉筛和埃氏筛法求素数模版

    public class Prime {
    
        public boolean[] visit; //true代表不是素数,false代表是素数
        public int[] prime; //记录着每一个质数值
        public int cnt = 0; //记录质数的个数
    
        //欧拉筛的时间复杂度O(n),每个数只筛一次,使用最小的质因子去筛
        public void Euler(int n) {
            visit = new boolean[n + 1];
            prime = new int[n + 1];
            visit[1] = true; //true不是质数
            for (int i = 2; i <= n; ++i) {
                if (visit[i] == false) //判定是否为素数
                    prime[++cnt] = i; //i是一个素数,存入prime数组中
                for (int j = 1; j <= cnt && i * prime[j] <= n; ++j) { //用已得到的素数去筛,并且不越界
                    visit[i * prime[j]] = true; //将最小质因子是prime[j]的数筛掉
                    if (i % prime[j] == 0) break; //如果prime[j]是i的最小质因数,则直接结束循环(如果不结束就会重复筛)
                }
            }
        }
    
    
        //埃氏筛法有重复筛同一个数,时间复杂度为O(n*log(log(n)))
        void Eratosthenes(int n) {
            prime = new int[n + 1];
            for (int i = 2; i <= n; i++) {
                if (prime[i] == 0) prime[++prime[0]] = i;
                for (int j = 1; j <= prime[0] && prime[j] <= n / i; j++) {
                    prime[prime[j] * i] = 1;
                    if (i % prime[j] == 0) break;
                }
            }
            cnt = prime[0];
        }
    
        public static void main(String[] args) {
            Prime p = new Prime();
            p.Euler(100);
            for (int i = 1; i <= p.cnt; i++) {
                System.out.print(p.prime[i] + ",");
            }
    
            p.Eratosthenes(100);
            for (int i = 1; i <= p.cnt; i++) {
                System.out.print(p.prime[i] + ",");
            }
        }
    }
  • 相关阅读:
    第五次博客作业
    第三次博客作业
    个人简介
    实验三
    实验二
    实验一
    《构建之法》心得体会
    第三次博客园作业
    软件测试实验二
    个人简历
  • 原文地址:https://www.cnblogs.com/zhihaospace/p/12807998.html
Copyright © 2011-2022 走看看