http://acm.hdu.edu.cn/showproblem.php?pid=3792
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;
}