素数筛选:
求出包括[x,y]之间素数有多少个。
一开始我就没看提示,一看提示就懵了,1居然不是素数,害的我好几次没通过。
打表求素数就是这道题的方法。
如果我求得一个数是素数的话,其倍数就一定不是素数(除1外)。
第二,也不是要把所有的倍数值求出,因为素数之间有相同的倍数值,如6=2*3=3*2,
所以我们只考虑到素数与素数减1的倍数值。即x(x-1);就可以了。
代码如下:
#include<stdio.h>
#include<string.h>
#define maxn 10000
int valid[maxn];
int getprime(int n,int a[])
{
int i,j;
int tot=0;
memset(valid,1,sizeof(valid));
for(i=2;i<=n;i++)
{
tot++;
a[tot]=i;
for(j=1;j<=tot&&j*a[j]<=n;j++)
{
valid[i*a[j]]=0;
if(i%a[j]==0)
break;
}
}
tot=0;
for(i=2;i<=n;i++)
if(valid[i])
tot++;
return tot;
}
int main()
{
int x,y,i,a[maxn],j=0;
scanf("%d%d",&x,&y);
if(x>y)
{
int temp=x;
x=y;
y=temp;
}
printf("%d\n",getprime(y,a)-getprime(x-1,a));
}