SDNU1522.陆历川学数学
Description
陆历川很热爱数学,最近他学了质数,他被质数深深的吸引,但是陆历川有个习惯,他喜欢给一些东西编号,所以他决定给所有的质数编号,例如给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<cstdio> #include<cstring> #include<iostream> using namespace std; #define ll long long #define maxn 1000000+8 ll tot,pri[maxn],s[maxn]; bool is[maxn]; void Eratosthenes() { tot=0; memset(is,1,sizeof(is));//定义is数组中所有数都为1;即假设所有数都为素数,方便后面筛出素数 is[0]=is[1]=0;//数字0和1的素数都为0 for(int i=2;i<maxn;i++) { if(is[i])//如果是素数的话,is[]肯定为1 { pri[++tot]=i;//将素数存入pri数组中 s[i]=tot;//储存编号 for(ll j=i+i;i<maxn;j+=i)//筛出不是素数的数 { is[j]=0; s[j]=tot; } } } } int main() { ll n; Eratosthenes()//埃氏筛在此处已经把从0到maxn的素数都筛选出来了,节省了程序运行的时间 while(~scanf("%lld",&n)) { printf("%lld\n",s[n]); } return 0; }