hdu 2138 How many prime numbers(miller_rabin?)

How many prime numbers

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3302    Accepted Submission(s): 1074
 
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
Author
wangye
Source
HDU 2007-11  Programming Contest_WarmUp
Recommend
威士忌
据说得用miller_rabin算法,但我用用了筛选,900多MS,猥琐的过了
一个数只要不能被小于其方根的质素整除即为质素
 
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 65537
using namespace std;
int f[N];
bool s[N];
int next=0;
void oprime()
{
  memset(s,0,sizeof(s));
  s[0]=s[1]=1;
  int i,j;
  for(i=2;i<N;i++)
  {
    if(!s[i])
    {
      f[++next]=i;//记录素数
      for(j=i+i;j<N;j+=i)
      s[i]=1;
    }
  }
}
int main()
{
  int m;
  int ans;
  oprime();
  while(scanf("%d",&m)!=EOF)
  {
    ans=0;
    for(int i=0;i<m;i++)
    {
      __int64 shu;
      scanf("%I64d",&shu);
      bool flag=0;
      if(shu==1)
      continue;
      for(int j=1;j<next&&int(sqrt(shu)+1)>f[j];j++)
      {
        if(shu%f[j]==0)
        {
          flag=1;
          break;
        }
      }
      if(!flag)
       ans++;
    }
    printf("%d\n",ans);
  }
}

posted @ 2012-04-28 20:35  剑不飞  阅读(201)  评论(0编辑  收藏  举报