hdu 2138 How many prime numbers 大规模素数判断

来源:互联网 发布:学办公软件 编辑:程序博客网 时间:2024/06/14 04:14


How many prime numbers

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


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
32 3 4
 

Sample Output
2

思路: 打表会超时,直接判断 或者 用 miller_rabin算法


code 1:

#include<bits/stdc++.h>using namespace std;int main(){    int n,b,ans,f,i;    while(scanf("%d",&n)!=EOF)    {        ans=0;        while(n--)        {            scanf("%d",&b);            f=0;            for(i=2; i<=sqrt(b*1.0); i++)// i*i<=b 会超时                if(b%i==0)                {                    f=1;                    break;                }            if(!f)ans++;        }        printf("%d\n",ans);    }    return 0;}


miller_rabin算法

code 2:

#include<iostream>using namespace std ;__int64 qpow(int a,int b,int r){    __int64 ans=1,buff=a;    while(b)    {        if(b&1)            ans=(ans*buff)%r;        buff=(buff*buff)%r;        b>>=1;    }    return ans;}bool Miller_Rabbin(int n,int a){    int r=0,s=n-1,j;    if(!(n%a))        return false;    while(!(s&1))    {        s>>=1;        r++;    }    __int64 k=qpow(a,s,n);    if(k==1)        return true;    for(j=0;j<r;j++,k=k*k%n)        if(k==n-1)            return true;    return false;}bool IsPrime(int n){    int tab[5]={2,3,5,7};    for(int i=0;i<4;i++)    {        if(n==tab[i])            return true;        if(!Miller_Rabbin(n,tab[i]))            return false;    }    return true;}int main(){    int n;    while(~scanf("%d",&n))    {        int ans=0,a;        for(int i=0;i<n;i++)        {            scanf("%d",&a);            if(IsPrime(a))                ans++;        }        printf("%d\n",ans);    }    return 0;}


code 1:
0 0
原创粉丝点击