线性素数筛 函数

感情迁移 提交于 2020-02-28 00:52:19
							//下标为数字, 数值判定是否为为素数,
int check[100000] = {0};	//0是,1不是, 假定全是素数。
int prime[100000/2];		//循序保存从2开始的素数数组 
int prime_num = 0;			//素数个数,结果要减一

void find_prime(int n)
{
	for(int i=2; i<=n; i++)	//寻找[2, n]的素数 
	{
		if(check[i] == 0)					//如果当前数标记为0, 即不是合数 
			prime[prime_num++] = i;		//则将该数添加到素数集合prime数组 
				
		for(int j=0; j<prime_num && i*prime[j]<n; j++)	//再将某些是该素数的倍数的数字标记为合数 
		{
			check[ i*prime[j] ] = 1;	//i*已有的素数集合
			
			if( i%prime[j] == 0 )		//关键 
				break;
		}
	}
}

测试

#include<iostream> 
#include<cstdio>
using namespace std;

int check[20005];	//基数桶 
int prime[20005/2];	//循序保存从2开始的素数数组 
int prime_num = 0;	//素数个数
 
void find_prime(int n)
{
	for(int i=2; i<=n; i++)	//寻找[2, n]的素数 
	{
		printf("\n%d--------------------------------", i);
		if(check[i]==0)	
		{
			printf("\nprime%d\n", i);
			prime[prime_num++] = i;	
		}			//如果当前数标记为0, 即不是合数 
			//则将该数添加到素数集合prime数组 
			
		for(int j=0; j<prime_num && i*prime[j]<n; j++)	//再将某些是该素数的倍数的数字标记为合数 
		{
			printf("\nno_prime: ");
			printf("%d*%d %d", i, prime[j], i*prime[j]);
			check[ i*prime[j] ] = 1;	//i*已有的素数集合
			
			if( i%prime[j] == 0 )		//关键 
				break;
		}
		printf("\n");
	}
}

int main()
{
	int n;	scanf("%d", &n);
	
	find_prime(n);
	
	printf("prime_num = %d\n", prime_num-1);
	for(int i=0; i<prime_num; i++)
		printf("%d ", prime[i]);
		
	return 0;
	
}

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!