num = 0;
memset(data, 0, sizeof(data));
data[1] = 1;
for(i=2; i<N; i++)
{
//data[i]为1表示i不是素数,为0表示i是素数
if( !data[i] )
prime[num++] = i;
//素数筛选
for(j=0; j<num&&i*prime[j]<N; j++)
{
data[i*prime[j]] = 1;
/*
i整除prime[j]便可退出,因为 i*prime[j+k](k>0) 一定会在后面被标记到
证明:
令i = prime[j]*x (整除)
i*prime[j+k] = prime[j]*x * prime[j+k] = prime[j] * (x*prime[j+k])
显然x*prime[j+k] > prime[j]*x = i 而 prime[j]为素数
当i增大到 x*prime[j+k] 便会标记到 prime[j] * (x*prime[j+k]) = i*prime[j+k]
所以 i*prime[j+k] 一定会在后面被标记到
*/
if( i%prime[j] == 0 )
break;
}
}
/*
在素数筛选中,合数只被标记一次,故里面总的循环次数接近N,加上外循环N次,时间复杂度为O(2n)即O(n)
*/
素数筛选 O(n)算法
最新推荐文章于 2024-10-22 14:31:28 发布