陆历川很热爱数学,最近他学了质数,他被质数深深的吸引了,但是陆历川有个习惯,他喜欢给一些东西编号,所以他决定给所有的质数编号,例如给2编号1,3编号2,5编号3........这样2,3,5就是质数里面的大当家,二当家和三当家了,陆历川现在知道了这些编号,现在他会给你一个数,他想知道这个数的所有的质因子里面的最大编号是多少?
注:0和1的编号都是0。
Input
一个自然数N(0<= N <= 1000000)
多组输入样例
Output
最大编号
Sample Input
1 2 3 4 5
Sample Output
0 1 2 1 3
#include<iostream>
#include<memory.h>
#include<cstdio>
using namespace std;
const int MAX = 1000005;
int Mark[MAX];
int ret[MAX];
//int findprimr[MAX];
int main()
{
int num,retprimr;
memset(Mark,0,sizeof(Mark));
int cnt = 1;
for(int i = 2;i <= MAX;i++)
{
if(Mark[i] == 1)
{
continue;
}
else
{
ret[i] = cnt;
for(int j = i * 2;j <= MAX;j += i)
{
Mark[j] = 1;
ret[j] = cnt;
}
cnt++;
}
}
while(scanf("%d",&num) != EOF)
{
if(num == 0 || num == 1)
{
printf("0\n");
continue;
}
printf("%d\n",ret[num]);
}
return 0;
}
素数筛的考察以及根据这个题目进行的素数筛的优化,使得耗时降低,就是在筛的时候就去存每一个数对应的最大质数编号,每一轮都会优化,就是我每筛出一个质数,都会优化它本身以及他的倍数对应的最大编号为该质数,优化完毕后得到的结果可以直接进行输出