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*/