昨天有个SB给我讲了一个线性筛选素数法O(n)的复杂度,感觉很神奇,自己看了看,
确实牛b的样子。其实它不像一般的筛选素数法会重复操作标记非素数,此方法不会重复
之行操作,遍历只需一次就行。
void get_prime()
{
int num = 0 ;
memset(vis,false,sizeof(vis));
for(int i = 2 ; i < n ; i ++)
{
if(!vis[i]) prime[num++] = i ;
for(int j = 0; j<num && i*prime[j]<n ; j ++)
{
vis[i*prime[j]] = true ;
if(i % prime[j] == 0) break ;
}
}
}
/*可以用均摊分析的方法来分析算法的复杂度,由于每
个合数都唯一的被它的最小素因子筛一次,而每个合
数的最小素因子都是唯一的,总复杂度是O(n)*/
一般 筛选素数法:
void get_prime()
{
int num = 0 ;
memset(vis,false,sizeof(vis));
for(int i = 2 ; i < n ; i ++)
{
if(!vis[i])
{
prime[num++] = i ;
for(int j = 2*i ; j < n ; j += i)
{
vis[j] = true ;
}
}
}
}