zju2011保研:Twin Prime Conjecture

来源:互联网 发布:java环境 编辑:程序博客网 时间:2024/04/30 07:27

http://acm.hdu.edu.cn/showproblem.php?pid=3792

浙大计算机研究生保研复试上机考试-2011年

1、素数筛法

2、一次得到所有n以下的孪生素数数目保存在数组里,否则,每次输入n,在判断会超时

#include <stdio.h>#include <string.h>int prime[100000];bool mark[100000];int p[100000];int size; void init()                      //素数筛法,得到10万内所有素数{int i;size=0;for (i=0;i<=100000;i++){mark[i]=false;}   for (i=2;i<=100000;i++)   {   if (mark[i])   {   continue;   }   prime[size++]=i;   if (i>=1000)                  {   continue;}   for (int j=i*i;j<=100000;j+=i)   {   mark[j]=true;   }   }}void ans()                      //因为超时,一次得到10万内所有孪生素数{p[0]=p[1]=p[2]=p[3]=0;  for (int i=4;i<=100000;i++)    //从4开始遍历{if (!mark[i]&&!mark[i-2])  //符合孪生,加1{p[i]=p[i-1]+1;}else{p[i]=p[i-1];}      }}int main(){   int n,i;   memset(prime,0,sizeof(prime));   init();                               //事先处理好   ans();   while (scanf("%d",&n)&&n>=0)          //输入一个数,直接查找数组相应值即可   {   printf("%d\n",p[n]);   }   return 0;}