一个前缀和的题目,题干如下:
n是两个连续的奇素数的平均值,且n不是素数,那么我们称这样的数是"内部素数"。求区间[a,b]内"内部素数"的个数。比如,前5个"内部素数"是4,6,9,12,15。
我的代码如下:
#include<stdio.h>
#define N 1000010
typedef long long ll;
int t[N],tt[N],prime[N];
void init()
{
int p=0;
for(int i=2;i<N;i++)
{
if(!t[i]) prime[++p]=i;
if(!t[i]&&i*i<N)
{
for(int j=i*i;j<N;j+=i)
t[j]=i;
} //埃筛,得到质数数组prime
}
for(int i=2;i<p;i++)
{
tt[(prime[i]+prime[i+1])/2]=1;
}
for(int i=1;i<N;i++)
{
tt[i]=tt[i]+tt[i-1];
}
}
int main()
{
init();
int T;
int a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&a,&b);
printf("%d\n",tt[b]-tt[a-1]);
}
return 0;
}
这个程序运行时会崩溃,如果把if(!t[i]&&i*i<N)改为if(!t[i]&&i<N/i),程序就可以正确运行,想知道原因是什么。