#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\n",indexes[n]);
return true;
}
int main()
{
createIndexes();
while(run());
return 0;
}
HDU 2136 Largest prime factor 参考代码
最新推荐文章于 2020-05-14 22:23:14 发布