ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

素数筛

2019-07-16 19:43:24  阅读:197  来源: 互联网

标签:prime int MAX 筛去 素数 visited


欧拉筛法打表

素数定理:
π(x)~x/ln(x)
不超过x的素数有π(x)个

//埃氏筛法
//筛出不超过MAX的素数
const int MAX=100005;
int visited[MAX];
int prime[MAX], cnt0;//筛出的素数的个数
void make_prime()
{
    memset(visited,0,sizeof(visited));
    for(int i=2;i<=MAX;i++)
        for(int j=2*i;j<=n;j+=i)
        {
            visited[j]=1;
        }
    //2的2,3,4,5...n倍
    //3的2,3,4,5...n倍
}
//时间复杂度O(nlog(n))


//改进后的欧拉筛法
//对于不超过n的每一个非负整数p,p限定为素数,第二重循环前面加上一个if(!visited[i])
//内层循环不必从2*i开始,已经被i==2时候筛去了
const int MAX=100005;
int visited[MAX];
//int prime[MAX], cnt0;//筛出的素数的个数
void make_prime()
{
    int m=sqrt(n+0.5);
    memset(visited,0,sizeof(visited));
    for(int i=2;i<=m;i++)
        if(!visited[i])
        	for(int j=i*i;j<=n;j+=i)
        	{
            	visited[j]=1;
        	}
    //2的2,3,4,5...n倍
    //3的2,3,4,5...n倍
}


//欧拉筛
const int MAX=100005;
bool is_prime[MAX];//筛子
int prime[MAX], cnt0;//筛出的素数的个数
void make_prime()
{
	cnt0 = 0;
	memset(is_prime, 0, sizeof(is_prime));
	for (int i = 2; i <= MAX; i++)//i代表筛去的倍数,以及这个数
	{
		if (!is_prime[i])prime[cnt0++] = i;//这个数没被筛,放进素数堆
		for (int j = 0; j < cnt0; j++)//遍历整个素数表,筛去i倍数的所有数字
		{
			if (i * prime[j] > MAX)break;
			is_prime[i * prime[j]] = 1;
			if (i % prime[j] == 0)break;//如果i是prime[j]的倍数,则不需要再筛
		}
        //筛去2的倍数
        //筛去3的倍数
        //筛去4的倍数
	}
    /*
	for (int i = 0; i <= 100; i++)
	{
		printf("%d\n", prime[i]);
	 } 
	 */
}

标签:prime,int,MAX,筛去,素数,visited
来源: https://blog.csdn.net/shen253135371/article/details/96170120

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有