描述 写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
输入
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
每组测试数据输出占一行,该行为m范围内所有孪生素数组数。
样例输入
1
14
样例输出
4
这道题很容易,只需要打个表就行。但是需要注意的是当输入的m为1的时候要输出0
我特么就因为这个问题,本来能一次通过的,™的错了好几次,最后看了好~几~遍~才注意到。唉~这个事故告诉我们认真读题是多么的重要
写这个题之前建议把第187题快速查找素数做一下
#include <stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
const int N=1000010;
int f[N];///素数表
int b[N];///结果表
int db()
{
f[0]=0;
f[1]=0;
int e=0;
int fa=2,fb=2;
b[fa]=0;
int i;
for(i=2;i<=sqrt(N);i++)///打素数表
{
if(f[i])
{
for(int j=i*i;j<N;j+=i)
{
f[j]=0;
}
}
else
b[i]=b[i-1];
}
for(i=2;i<N;i++)///打结果表
{
if(f[i])
{
b[i]=b[fa];
if(i-fa<=2)
{
b[i]++;
}
fa=i;
}
else
b[i]=b[i-1];
}
}
int main()
{
int n;
memset(f,-1,sizeof(f));
memset(b,0,sizeof(b));
db();///调用函数
scanf("%d",&n);
while(n--)
{
int a;
scanf("%d",&a);
if(a!=1)///判断输入是否为1
printf("%d\n",b[a]-1);
else
{
printf("0\n");
}
}
return 0;
}