Eratosthense筛法
介绍一下Eratosthense筛法(这里是素数表的打法)
对于不超过n的每个非负数P删除2*p,3*p.....,当处理完所有的剩下的就是素数了,
优化方案之一是判重,二是开平方和平方。
首先解释为什么要平方,因为假设i是大于2的,那么i之前的2i,3i,4i什么的都已经被2倍3倍的筛掉了,所以要平方,
再来解释为什么开方就简单了,都i*i做起始了,不开方后边的也是浪费。
#include<stdio.h> #include<math.h> #include<string.h> #define INF 1000000 int vis[1234567]; int main() { memset(vis,0,sizeof(vis)); int h=sqrt(INF+0.5); for(int i=2;i<=h;i++){ if(!vis[i]){ for(int j=i*i;j<=INF;j+=i) vis[j]=1; } } int n,m; while(~scanf("%d%d",&n,&m)){ int step=0; for(int i=n;i<=m;i++) if(!vis[i]) step++; printf("%d\n",step); } }
我觉得这是一种思想可以用在其他的优化上,引用空间来缩短时间,还有就是开平方和平方的处理 。