//下标为数字, 数值判定是否为为素数,
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;
}
来源:CSDN
作者:桐贤
链接:https://blog.csdn.net/weixin_43629540/article/details/104541496