poj 3177

素数筛选:

求出包括[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));

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值