首页 > 代码库 > 素数筛 模板
素数筛 模板
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 int prim[3000000]={2,3,5}; 8 //素数是分为基本素数{2,3}、阳素数{6N+1,N>=1}形式的、阴素数{6N-1,N>=1}形式的 9 //为了代码的好写,在这里这样写的 :10 //数除了{2,3,5}为素数,其他的数可以写成6N,6N+1,6N+2,6N+3,6N+4,6N+5 N>=1 可以表示全部的数11 //6N,6N+2,6N+4都为偶数,不是素数,6N+3 == 3(2N+1) 不是素数,那么就只筛6N+1和6N+5就可以了12 int main()13 {14 int i, j, flag;15 int gcd = 2;16 int k = 3;17 18 for(i=7;i<=20000000;i+=gcd)19 {20 gcd = 6-gcd;//6N+1和6N+5的变换。21 flag = 1;22 for(j=0;prim[j]*prim[j]<=i;j++)//判断一个数是否为素数,只需判断这个数在2--sqrt(x)范围即可。23 if(i%prim[j] == 0){//因为一个开根号比乘法是要慢的,所以用乘法速度更快。24 flag = 0;25 break;26 }27 if(flag)//若这个数没有被其他素数整除 说明为素数。28 prim[k++] = i;29 }30 for(i=0;i<k;i++)31 printf("%d ",prim[i]);32 return 0;33 }
以上筛法为一位浙江工业大学的老学长的解题报告中给出的,在此引用,但是不知道他老人家的名字,万分惭愧。在此谢谢。
上面筛法为欧拉筛法的一种优化。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 int hash[2000003]; 8 int prim[500000]; 9 //此为埃氏筛法,是很朴素的一种筛法,O(nlogn)的时间复杂度,可以应付大部分的素数筛,而且代码很短。10 int main()11 {12 int i, j, k = 0;13 14 memset(hash,0,sizeof(hash));15 for(i=2;i<=2000000;i++)16 {17 if( !hash[i]){18 prim[k++] = i;19 for(j=2*i;j<=2000000;j+=i)20 hash[j] = 1;21 }22 }23 for(i=0;i<k;i++)24 printf("%d ",prim[i]);25 return 0;26 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。