时间复杂度接近线性
核心代码
#include<iostream>
#include<cstring>
using namespace std;
const int maxx=10000000;
int prime[maxx];
bool vis[maxx]; /*vis数组的标记与prime的数组下标一一对应*/
int n;
void primee(int n)
{
memset(vis,false,sizeof(vis)); /*将所有的数字进行标记*/
int m=0;
for(int i=2;i<n;i++)
{
if(!vis[i])
{
prime[++m]=i;
}
for(int j=1;j<=m&&prime[j]*i<=n;j++) /*判断条件意义:j<=m是保证prime[]数据存在,prime[]*i是保证数字在n的范围内*/
{
vis[prime[j]*i]=true; /*prime[]的倍数的数字肯定不是素数,将他们全部标记*/
if(i%prime[j]==0) /*这一步缩短了很多时间,比如i=9时,prime数组中有2,3,5,7,9*5=45,当i=15时,15*3再次进行了计算,有这步操作,可以减少很多这样类似的繁琐操作,极大的降低了时间*/
break;
}
}
}