素數打表法 高效率


素數打表法一直在被人們優化,但是如果你只是想得到一個范圍內的所有素數,,這個方法是最快的。

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    #define maxn 10000000
    bool visit[maxn+1000000];
    int prime[maxn],n; ///prime的大小大概估計一下再開數組。大概是(x/lnx)
    void getprime()
    {
        memset(visit, false, sizeof(visit));
        int num = 0;
        for (int i = 2; i <= n; ++i)
        {
            if ( !visit[i] )  prime[++num] = i;
            for (int j = 1; j <= num && i * prime[j] <= n ;  j++)
            {
                visit[ i  *  prime[j] ]  =  true;
                if (i % prime[j] == 0) break; ///此處是重點,避免了很多的重復判斷,比如i=9,現在素數是2,3,5,7,進入二重循環,visit[2*9]=1;visit[3*9]=1;這個時候9%3==0,要跳出。因為5*9可以用3*15來代替,如果這個時候計算了,i=15的時候又會被重復計算一次,所以這里大量避免了重復運算。
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        getprime();
        return 0;
    }

 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com