zoukankan      html  css  js  c++  java
  • 筛选法求素数

    来自:【数据结构与算法分析——C语言描述】练习2.14

    问题描述:Eratosthenes筛是一种用于计算小于N的所有素数的方法。我们从制作整数2到N的表开始。我们找出最小的未被删除的整数i,打印i,然后删除i, 2i, 3i, ..., 当i > √N时,算法终止。

    首先,没必要做2到N的表,在一个循环内遍历2到N即可。

    其次,所谓最小也没必要判断,依次遍历时整数i自然是它到最后一个数之间的最小值。

    最后,整数i是否被删除等价于整数i是否素数flag[i]==1或0表示,1表示素数,0表示非素数。

    思路:如果整数i是素数,打印它,然后删除它的倍数。i==2时删除2的倍数,等于3时删除3的倍数,等于5时删除5的倍数,... ,直到N为止。

    void Eratosthenes(int N)
    {
        char * flag;
        int i, j;
    
        flag = (char *)malloc(sizeof(char)*N);
        memset(flag, '1', sizeof(char)*N);
    
        for (i = 2; i < N; i++)
        {
            if (flag[i] == '1')
            {
                printf("%d	", i);
                for (j = 2; j*i < N; j++)    //删除素数i的倍数
                    flag[j*i] = '0';
            }
        }
        free(flag);
    }

    测试结果:

     其中数据IO花费了不少的时间。

    这是筛选法最简单的思路之一,还可以继续优化,比如:因为除了2所有的偶数都不是素数,所以可以排除一半的数据量。也可以对外层循环只遍历到根号N,可以减小循环的规模。

  • 相关阅读:
    库函数(汇总)
    IE jQuery ajax 请求缓存问题
    Jarvis OJ-level3
    在64位的linux中运行32位的应用程序
    ROP之linux_x64知识杂记
    2017年网络空间安全技术大赛部分writeup
    Sniper OJ部分writeup
    gdb插件使用方法
    pwntools学习
    linux虚拟机安装值得注意的几点
  • 原文地址:https://www.cnblogs.com/mingc/p/5890563.html
Copyright © 2011-2022 走看看