zoukankan      html  css  js  c++  java
  • 素数筛选模板

    1.普通素数筛选模板

    最普通的方法。。。

    //判断是否是一个素数  Mark 标记数组 index 素数个数
    int Prime(){
        int index = 0;
        memset(Mark,0,sizeof(Mark));
        prime[index++]=2;
        for(int i = 3;i < MAXSIZE;i+=2){
            if(Mark[i] != 1)
            {
                prime[index++] = i;
                for(int j = i+i;j < MAXSIZE;j += i){
                    Mark[j] = 1;
                }
            }
        }
        return index;
    }

     2.快速素数筛选

    这种方法经证明只需要2n的复杂度,但是因为有*,/,%等运算,所以只比一般素数筛选快3倍左右。

    关于复杂度的证明,用整体的思路就很好证明,算法由一层循环O(n)再加上所有产生的合数,可以证明每个合数都会被产生一次且仅一次。

    所以这个算法每一次运算都产生了一个合数(真是牛逼),没有丝毫重复的操作。最终复杂度为O(n)

    int Mark[MAXSIZE];
    int prime[MAXSIZE];
    
    //判断是否是一个素数  Mark 标记数组 index 素数个数
    int Prime(){
        int index = 0;
        memset(Mark,0,sizeof(Mark));
        for(int i = 2; i < MAXSIZE; i++)
        {
            //如果未标记则得到一个素数
            if(Mark[i] == 0){
                prime[index++] = i;
            }
            //标记目前得到的素数的i倍为非素数
            for(int j = 0; j < index && (long long)prime[j] * i < MAXSIZE; j++)
            {
                Mark[i * prime[j]] = 1;
                if(i % prime[j] == 0){
                    break;
                }
            }
        }
        return index;
    }
  • 相关阅读:
    luogu_1414 又是毕业季II
    luogu_1372 又是毕业季I
    luogu_1313 计算系数
    luogu_1134 阶乘问题
    luogu_1514 引水入城
    luogu_1120 小木棍
    文件操作
    快速排序
    c oth
    ANSI C与C89、C99、C11区别差异
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/5231807.html
Copyright © 2011-2022 走看看