题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=520
思路:
1.赛选法打素数表;
2.求素数因子;
3.二分法找序号;
代码如下:
#include <iostream>
#include <stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
const int MAX =1000001;
bool a[MAX];
int b[MAX];
int erfen(int left,int right,int m)
{
while(right-left>1)
{
int mid=(left+right)/2;
if(b[mid]==m)
return mid;
else if(b[mid]>m)
right=mid;
else
left=mid;
}
return -1;
}
int is_prime()
{
memset(a,true,sizeof(a));
int i,j;
for(i=2;i<MAX/2;i++)
{
if(a[i])
{
for(j=i<<1;j<=MAX;j+=i)
{
a[j]=false;
}
}
}
j=1;
b[0]=1;
for(i=2;i<MAX;i++)
{
if(a[i])
{
b[j]=i;
j++;
}
}
return j;
}
main()
{
int i,j,m;
int max;
int v=is_prime();
while(~scanf("%d",&m))
{
if(m==1)
{
printf("0\n");
continue;
}
max=0;
for(i=2;i<=sqrt(m);i++)
{
while(m!=1)
{
if(m%i==0)
{
m/=i;
}
else
break;
}
max=i;
}
max=m==1?max:m;
printf("%d\n",erfen(0,v,max));
}
}