hdu2138: How many prime numbers

hdu2138: http://acm.hdu.edu.cn/showproblem.php?pid=2138
题意:给出n个数,求素数个数 解法:为了不超时,加速法:求出65535内的素数,对于65535以后的数,若不能被这些素数整除,则为素数。证明如下:对于大于65535的整形非素数,有两种情况,一种是至少有一个因子在65535内,另一种是所有因子都在65535内,但是65536*65535>int,所以第二种不可能。
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int v[65536],w[65536];
int main()
{
    int n,x;
    memset(v,0,sizeof(v));
    for(int i=2;i*i<=65535;i++)
    {
        if(v[i])
            continue;
        for(int j=i*i;j<=65535;j+=i)
            v[j]=1;
    }
    int k=0;
    for(int i=2;i<=65535;i++)
    {
        if(v[i]==0)
            w[k++]=i;
    }
    while(scanf("%d",&n)!=EOF)
    {
        int ans=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&x);
            if(x<=65535)
            {
                if(!v[x])
                    ans++;
            }
            else
            {
                int j;
                for(j=0;j<k;j++)
                {
                    if(x%w[j]==0)
                        break;
                }
                if(j==k)
                    ans++;
            }
        }
        printf("%d\n",ans);
    }
}
/*input:
3
2 3 4
output:
2*/

posted on 2012-07-25 21:14  acmer-jun  阅读(155)  评论(0编辑  收藏  举报

导航