Problem Description
Everybody knows any number can be combined by the prime number.
Now, your task is telling me what position of the largest prime factor.
The position of prime 2 is 1, prime 3 is 2, and prime 5 is 3, etc.
Specially, LPF(1) = 0.
Input
Each line will contain one integer n(0 < n < 1000000).
Output
Output the LPF(n).
Sample Input
1
2
3
4
5
Sample Output
0
1
2
1
3
题意:每个数都能由多个素数组成,问组成它最大的素数是素数表里的第几个(规定当输入为1的时候,输出0)
由于给的范围很大,所以最好用素数筛选的方法,主要思想是:组成一个数最大的素数是x,那么组成x的倍数的最大素数也可以暂且是x
举个例子:组成3的最大公因数是3,3在素数表中是第2个,所以我们可以暂且把组成6、9、15····都看作是3,但是我们发现,组成15的最大公因数是5而不是3,其实没关系,因为我们循环到5的时候,会把15的值给覆盖的
废话不多说,上代码:
#include<stdio.h>
#define MAX 1000005
int a[MAX]; //这个数组解释:组成x的最大公因式在素数表中是第a[x]个素数
//全局变量不赋初值默认为0
void init()
{
int i,j,k;
for(i=2,k=1;i<1000000;i++) //k作为说明循环到素数表的第几个素数,每完成一次赋值,k++
{
if(a[i]==0)
{
a[i]=k;
for(j=i+i;j<1000000;j+=i) //暂时把i的倍数都赋值k
{
a[j]=k;
}
k++; //完成一次完整赋值,k++
}
}
}
int main()
{
int n;
init();
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",a[n]);
}
return 0;
}