**
Prime Twins
**
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ]
Acceteped : 1602 Submit : 4838
Time Limit : 1000 MS Memory Limit : 65536 KB
Description
题目描述
如果n和n+2都是素数,我们称其为孪生素数,比如3和5,5和7都是孪生素数。 给你一个区间[a,b],请问期间有多少对孪生素数?
输入
第一行是一个整数K(K≤ 10000),表示样例的个数。 以后每行一个样例,为两个整数,a和b,1≤a≤b≤5000000。
输出
每行输出一个样例的结果。
样例输入
5
1 3
1 10
1 100
1 1000
1 5000000
样例输出
0
2
8
35
32463
Sample Input
Sample Output
Source
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ]
[ Home Page ] [ Go Back ]
#include <stdio.h>
int isprime[5000001]; //素数为1
int count[5000001];
/*main函数里面的数组是开在栈区(stack),在函数外面的是开在数据区的。栈区的内存比较小,所以当数组非常大的时候,就会报错。假如把数组放在数据区就不会出现这个问题,因为数据区的内存很大。
*/
int main()
{
int i,j;
for(i=2;i<=5000000;i++)
{
isprime[i]=1;
}
isprime[0]=0;
isprime[1]=0;
for(i=2;i<=5000000;i++) //如果i不是素数,就令isprime[i]=0
{
if(i==2)
{
isprime[i]=1;
}
if(isprime[i]==0)
{
continue;
}
for(j=i+i;j<=5000000;j=j+i)
{
isprime[j]=0;
}
}
for(i=0;i<=5000000;i++) count[i]=0;
for(i=1;i<=5000000;i++)
{
count[i]+=count[i-1];
if(isprime[i]==1&&isprime[i+2]==1)
{
count[i+2]++;
}
}
int K,a,b;
scanf("%d",&K);
while(K--)
{
scanf("%d%d",&a,&b);
int c=count[b]-count[a+1];
printf("%d\n",c);
}
return 0;
}