hdu2136Largest prime factor (关建在求素数,有点意思的题)

2014-11-24 13:20:13 · 作者: · 浏览: 16
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题意:求一个数的最简因式中最大素数因子在所有的素数中位置,位置从0开始。分析:所有的数都可以用素数的倍数来表示,原因:数分为两类:素数和非素数。非素数那么一定可以分解得到最简因式,素数不能分解,其最简因式是本身。综上所述:一个数的最简因式中因子一定全是素数。方法一: 
#include
   
    
int prim[1000005]={0};
void init()
{
    int k;
    prim[1]=0; k=1;
    for(int i=2;i<1000000;i++)
    if(prim[i]==0)//i是素数
    {
      for(int j=i; j<1000000; j+=i)
        prim[j]=k;
        k++;
    }
}
int main()
{
    int n;
    init();
    while(scanf("%d",&n)>0)
        printf("%d\n",prim[n]);
}

   


方法二:
#include
   
    
int vist[1000005]={0},prim[1000005];
void init()
{
    int k;
    prim[1]=1; prim[2]=2;k=3;
    for(int i=3;i<1000000;i+=2)
    if(vist[i]==0)
    {
        prim[i]=k; k++;
        for(int j=i; j<1000000; j+=i)
        if(vist[j]==0)
        vist[j]=1;
    }
}
int main()
{
    int n,posit;
    init();
    while(scanf("%d",&n)>0)
    {
        posit=1;
        for(int i=2; ; i++)
            if(prim[n]==0)
            {
                if(prim[i]&&n%i==0)posit=i;
                while(n%i==0)n/=i;
            }
            else
            {
               if(n>posit)posit=n; break;
            }
            printf("%d\n",prim[posit]-1);
    }
}