zoukankan      html  css  js  c++  java
  • 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;


     

  • 相关阅读:
    poj1703
    poj 2385
    poj 3169 差分约束
    poj3723 最大权森林
    POJ3255 次短路
    图论算法----最小生成树
    给linux操作系统安装中文环境
    Windows下使用python
    pku3668 Game of Lines
    pku3670 Eating Together
  • 原文地址:https://www.cnblogs.com/whatthefy/p/3022784.html
Copyright © 2011-2022 走看看