算法思想:每次遇到质数,都将所有以该数字为因子的数的最大编号更新。
【1-1e6】中的所有数字最终更新完毕
线性筛的时间复杂度是O(n)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n;
bool vis[maxn];
int num[maxn];
int top;
void prime(int x)
{
memset(vis,0,sizeof(vis));
int top=0;
for(int i=2; i<x; ++i)
if(!vis[i])
{
num[i]=++top;
for(int j=i<<1; j<x; j+=i)
{
num[j]=top;
vis[j]=1;
}
}
}
int main()
{
memset(num,0,sizeof(num));
prime(maxn);
while(~scanf("%d",&n))
{
printf("%d\n",num[n]);
}
return 0;
}