//O(n)的筛法,每个合数只被它的最小质因子筛一次
//每一次的外循环筛出i和找到的质数
int maxn;
int prime[120000];//prime[0]记录当前为止找到的素数的个数,1~n存找到的素数
int visit[120000];//0表示是素数
void Prime()
{
memset(visit,0,sizeof(visit));
memset(prime, 0,sizeof(prime));
for (int i = 2; i <= maxn; i++)
{
cout<<" i = "<<i<<endl;
if (!visit[i])
{
prime[++prime[0]] = i;//记录素数的个数,同时存找到的素数
}
for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++)//遍历每一个已找到的素数
{
// cout<<" j = "<<j<<" prime["<<j<<"]"<<" = "<<prime[j]<<" i*prime[j] = "<<i*prime[j]<<endl;
visit[i*prime[j]] = 1;//这个素数的倍数是合数
if (i % prime[j] == 0)//因为每个数只被它的最小质因子筛一次,在此之后的质数不用筛,以后会筛
{
break;
}
}
}
}