素数筛选-hdu2710

题目描述:

题目大意:找出具有最大素数因子的整数。如果有不止一个,则输出在输入文件中出现最早的一个。

解题思路:刚开始时,p数组中的元素全为0,刚开始对于素数 i,p[i]=0,用一个for循环,将是素数 i 的倍数的数 的在数组p中的值全部赋值为 i;

如:第一轮:2为素数,p[2]=0,p[4]=2,p[6]=2,p[8]=2......p[2*n]=2;

      第二轮:3为素数,  p[3]=0,p[6]=3,p[9]=3,p[12]=3......p[3*n]=3;

       第...轮:i为素数,p[i]=0,p[i+n*i]=i;

再如下列测试案例中 m=38时,在第一轮中,2为素数,38是2的倍数,所以p[38]=2;在第18轮(即i=19)时,19为素数,而38是19的倍数,所以p[38]更新为19

代码实现:

#include<stdio.h>
#include<iostream>
const int MAX=20005;
int p[MAX];
using namespace std;
int main()
{
    int n,s,m,maxn;
    int i,j;
    p[1]=1;
    for(i=2;i<MAX;i++)
    {
        if(p[i]==0)
        for(j=i;j<MAX;j+=i)//这一段代码不断实现对p数组进行更新
            p[j]=i;
    }
    while(~scanf("%d",&n))
    {
        maxn=-1;
        while(n--)
        {

            scanf("%d",&m);
            if(p[m]>maxn)
            {
                maxn=p[m];
                s=m;
            }
        }
        printf("%d\n",s);
    }
    return 0;
}

 

posted @ 2018-11-20 21:35  里昂静  阅读(252)  评论(0编辑  收藏  举报