关于埃氏筛法,简单说是选取素数较快的方式,这里展示一个返回素数表的函数。
注意这里的素数被置为 false。
//埃氏筛法实例, 初始全为 false, 非素数置为 true
bool* PrimeTable(int table_size)
{
bool* table = (bool*)calloc(table_size+1, sizeof(bool));
int i, j;
for(i=0; i<=table_size; i++)
{
if(i<2)
table[i] = true;
else if(i%2 == 0 && i!=2)
table[i] = true;
}
for(i = 3; i <= table_size; i+=2)
{
if(!table[i])
for(j = i*i; j <= table_size; j+=i)
table[j] = true;
}
return table;
}
函数返回一个布尔数组,数字对应序号的数组成员的真假值表示非或是素数。
需要 stdlib.h 和 stdbool.h (for C),或者 iostream 和 cstdlib (for C++)。
不要忘了在合适的时间释放动态分配的空间。
*一个改进的存放方式的版本:
//返回一个存放素数判断的表
//0存放2,后续对应比2大的奇数,素数记为false
bool* PrimeTable(int table_size)
{
int size = table_size/2+1;
int val;
bool* table = (bool*)calloc(size, sizeof(bool));
if(table == NULL)
{
fprintf(stderr, "Memory allocate failed.\n");
exit(-1);
}
int i, j;
for(i = 1; i <= size; i++)
{
val = 2*i+1; //i = 1,2,3... val = 3,5,7...
if(!table[i])
for(j = val*val; j <= table_size; j+= 2*val)
table[(j-1)/2] = true;
}
return table;
}
//判断自然数num是否为素数
bool IsPrimeOnTable(int num, bool* Table)
{
bool answer = false;
if(num == 2)
answer = true;
if(num%2 != 0 && num > 2)
if(!Table[(num-1)/2])
answer = true;
return answer;
}
大约减少了一半的空间。