#include <iostream> #include <vector> #include <cmath> using namespace std; const int MAX=1000001; bool isPrime[MAX];//isPrime[i]=true表示是素数,false表示不是 int indexes[MAX]; //存放素数因子的序号 void eraosthenes() { fill(isPrime,isPrime+MAX,true);//如果0~MAX都是素数 isPrime[0]=isPrime[1]=false; //把0,1筛去 int n=sqrt((double)MAX); for(int i=2; i<=n; i++) { if (isPrime[i]==false) continue; for(int j=i*i; j<MAX; j+=i) { if (isPrime[j]==false) continue; isPrime[j]=false; } } } void createIndexes() { eraosthenes(); int i,k=1; for(i=2; i<MAX; i++) if (isPrime[i]==true) indexes[i]=k++; int m=MAX/2; for(i=2; i<=m; i++) { if (isPrime[i]==true) { int pos=2*i; while(pos<MAX) { indexes[pos]=indexes[i]; pos+=i; } } } } bool run() { int n; if (scanf("%d",&n)==EOF) return false; printf("%d ",indexes[n]); return true; } int main() { createIndexes(); while(run()); return 0; }