HDOJ-2138(How many prime numbers)(素数判定)
How many prime numbers
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14681 Accepted Submission(s): 5090
Problem Description
Give you a lot of positive integers, just to find out how many prime numbers there are.
Input
There are a lot of cases. In each case, there is an integer N representing the number of integers to find. Each integer won’t exceed 32-bit signed integer, and each of them won’t be less than 2.
Output
For each case, print the number of prime numbers you have found out.
Sample Input
3 2 3 4
Sample Output
2
/*按int型的数据范围大小:0~2^32-1开素数表数组,会超内存*/
My solution:
/*2015.12.20*/
法一:(半暴历+半打表)
#include<stdio.h>
#include<string.h>
#include<math.h>
bool prim[10000000];
void dabiao()//素数打表
{
int i,j;
memset(prim,0,sizeof(prim));
for(i=2;i<10000000;i++)
{
if(!prim[i])
for(j=2;j*i<=10000000;j++)
prim[j*i]=1;
}
return ;
}
int main()
{
int n,i,j,count,q,k;
dabiao();
while(scanf("%d",&n)==1)
{
count=0;
for(i=0;i<n;i++)
{
scanf("%d",&j);
if(j>10000000)//超出素数表的范围,需单独判断
{
q=sqrt(j);
for(k=2;k<=q;k++)
if(!prim[k])
{
if(!(j%k))
break;
}
if(k>q)
count++;
}
else if(prim[j]==0)
count++;
}
printf("%d\n",count);
}
return 0;
}
法二:(暴历)
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int n,i,j,count,q,k;
while(scanf("%d",&n)==1)
{
count=0;
k=0;
for(i=0;i<n;i++)
{
scanf("%d",&j);
q=sqrt(j);
if(j==2)
count++;
else
for(k=2;k<=q;k++)
if(!(j%k))
break;
if(k>q)
count++;
}
printf("%d\n",count);
}
return 0;
}