您的位置:首页 > 其它

Largest prime factor

2016-10-27 21:53 239 查看

Largest prime factor

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6261 Accepted Submission(s): 1921
 
[align=left]Problem Description[/align]
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.

 
[align=left]Input[/align]
Each line will contain one integer n(0 < n < 1000000).

 
[align=left]Output[/align]
Output the LPF(n).

 
[align=left]Sample Input[/align]

1
2
3
4
5


 
[align=left]Sample Output[/align]

0
1
2
1
3


 
[align=left]Author[/align]
Wiskey
 
[align=left]Source[/align]
HDU 2007-11 Programming Contest_WarmUp
 
[align=left]Recommend[/align]
威士忌
 
看到一很好的方法
求素数的问题,但数据范围是0 < n < 1000000这么大,很明显平时我们穷举数字,再一个个去判断是否是素数,肯定超时,这就要用到效率非常高的求素数的算法了
 竞赛中一般用素数筛选法来处理此类问题,关于素数筛选法生成素数表,这个网上资料也很多,可以自己搜索学习,简单的说是用了一个思想:(素数的倍数一定是个合数)。建立一个全1的数组(下标2~N),先将下标是2的倍数的全置0,再将下标是3的倍数全置0,……,以此类推,
最后剩下的,仍是1的那些下标,就肯定是素数了。
这样做远远比过去穷举数字快是不是??你们可以体会下。

AC代码:

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<algorithm>

using namespace std;

const int MAX=1000000;

 int prime[MAX]={0};

 int mark[MAX]={0};
 void init()

 {

     for(int i=2,n=1;i<MAX;i++)    //枚举

         {

            if(prime[i]==0)        //0标志位代表是素数

                 {

                     mark[i]=n++;    //记录这个素数对应的序号

                     for(int j=i;j<MAX;j=j+i)    //素数的倍数,肯定不是素数

                        {

                             prime[j]=i;                //去掉标志位,记录最大质因数

                         }

                 }

        }

 }

 int main()

 {

     int n;

     init();

    while(~scanf("%d",&n))

         {

            printf("%d\n",mark[prime
]);    //prime中存放这个数的最大质因数

        }

     return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: