http://acm.hdu.edu.cn/showproblem.php?pid=1397
AC代码
View Code
#include<stdio.h> #include<string.h> #include<math.h> int a[32768]; int b[32768]; int main() { int x,sum; int i,j; int n=32768; for(i=1;i<=n;i++) { a[i]=1; } for(i=4;i<=n;i++) if(i%2==0) a[i]=0; for(int i = 2; i <= sqrt(double(n+0.5)); i++) if(a[i]) { for(int j = i*i; j <= n; j += 2*i) { a[j] = 0; } } while(scanf("%d",&x)!=EOF) { if(x==0) break; sum=0; memset(b,0,sizeof(b)); for(i=2;i<x-1;i++) if(a[i]==1&&(a[x-i]==1)) if(b[i]==0&&b[x-i]==0) {sum++; b[i]++; b[x-i]++; } printf("%d\n",sum); } return 0; }
The Sieve of Eratosthens
爱拉托逊斯筛选法
对于不超过n的每个非负整数P,删除2*P,3*P,4*P...最后留下来的都是素数
如果a[i]=1则表示没有被删除,如果a[i]=0则已经被删除了
最基本的代码
View Code
memset(a,1,sizeof(a)); for(int i=2;i<=n;i++) for(int j=2*i;j<=n;j+=i) a[i]=0;
这个的效率很高了,但是效率还不够高。
我们可以进行两次优化,第一个for只进行到sqrt(n+0.5),然后进行一次判断,如果没有被删除才继续进行下面的循环
第二个for循环从j=i*i开始进行。
优化代码如下
View Code
memset(a,0,sizeof(a)); for(i=2;i<sqrt(n+0.5);i++)if(a[i]==0) for(j=i*i;j<=n;j+=i) a[j]=1;