先上一般筛素数的方法:
int check[SIZE] = {0};//元素值为0代表是素数
int prime[SIZE] = {0};
int pos=0;
int flag;
for (int i = 2 ; i < SIZE ; i++)
{
if (!check[i])//如果是素数
prime[pos++] = i;
for (int j = 2*i ; j < SIZE ; j += i)
{
check[j] = 1;
}
}
这种筛除方法思想为一次循环筛掉当前素数的倍数,会有重复的,效率不高。比如6在i=2时筛了一次,后面i=3时又筛了一次。
线性筛弥补了这种缺点:(按照一个数的最小素因子筛选,比如6只按2筛去)
int main()
{
int check[SIZE] = {0};//元素值为0代表是素数
int prime[SIZE] = {0};
int pos=0;
int flag;
for (int i = 2 ; i < SIZE ; i++)
{
if (!check[i])//如果是素数
prime[pos++] = i;
for (int j = 0 ; j < pos && i*prime[j] < SIZE ; j++)
{
check[i*prime[j]] = 1;//筛掉
if (i % prime[j] == 0)
break;
}
}
return 0;
}
筛的数如下图:
转自:https://www.jianshu.com/p/f16d318efe9b