The Sieve of Eratosthens(爱拉托逊斯筛选法)

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;


 

原文地址:https://www.cnblogs.com/whatthefy/p/3022784.html