美文网首页程序员
集合包含排斥法求120内素数个数

集合包含排斥法求120内素数个数

作者: 林天涯 | 来源:发表于2018-02-26 21:11 被阅读0次

思路


  1. 思想是所有的合数都可由若干个素数因子的积构成,如 18 = 2 * 3 * 3 等等。
  2. 考虑到 11*11 = 121 > 120 可以大胆推论,120以内的任意一个合数的其中一个素数因子必属于集合{2,3,5,7}。当然如果N是121到168,必须将11也纳入其中,依次类推
  3. 现设集合A、B、C、D是120内能分别整除2,3,5,7的数的集合,可以非常肯定地认为除开2,3,5,7本身,A、B、C、D的并集包含了120以内所有的合数,相应的素数个数就是这个并集的补集包含的元素数(当然还不够,还得剔除1,加上2,3,5,7)
  4. 现在求素数的个数,相当于求~(A∪B∪C∪D)的元素数,再加上3(去掉1就是减1,加上2,3,5,7就是加4)
  5. 总结公式:
由 |A∪B|= (|A|+|B|) - |AB|  可以推广
|A∪B∪C∪D| = (|A|+|B|+|C|+|D|) -(|AB|+|AC|+|AD|+|BC|+|BD|+|CD|) + (|ABC|+|ABD|+|ACD|+|BCD|) - |ABCD|
  最终素数个数 S = 120 - |A∪B∪C∪D| + 3;

Codes


/**
 * 集合论包含排斥算法的简单应用
 * 求120以内的素数个数
 * @author Fairy2016
 *
 */
public class CollectionAlgorithm {

    public static void main(String args[]) {
        
        int N = 120;
        
        /**
         * |A∪B∪C∪D| = (|A|+|B|+|C|+|D|)-(|AB|+|AC|+|AD|+|BC|+|BD|+|CD|)+
         *                  (|ABC|+|ABD|+|ACD|+|BCD|)-|ABCD|
         *  最终素数个数 S = 120 - |A∪B∪C∪D| + 3;
         */
        int CountA = N / 2; //|A| 能被2整除的数的个数
        int CountB = N / 3; //|B| 能被3整除的数的个数
        int CountC = N / 5; //|C| 能被5整除的数的个数
        int CountD = N / 7; //|D| 能被7整除的数的个数
        
        int CountAB = N / (2 * 3); //|AB| 能同时被2,3整除的数的个数
        int CountAC = N / (2 * 5); //|AC| 能同时被2,5整除的数的个数
        int CountAD = N / (2 * 7); //|AD| 能同时被2,7整除的数的个数
        int CountBC = N / (3 * 5); //|AB| 能同时被3,5整除的数的个数
        int CountBD = N / (3 * 7); //|AB| 能同时被3,7整除的数的个数
        int CountCD = N / (5 * 7); //|AB| 能同时被5,7整除的数的个数
        
        int CountABC = N / (2 * 3 * 5); //|ABC| 能同时被2,3,5整除的数的个数
        int CountABD = N / (2 * 3 * 7); //|ABD| 能同时被2,3,7整除的数的个数
        int CountACD = N / (2 * 5 * 7); //|ABD| 能同时被2,5,7整除的数的个数
        int CountBCD = N / (3 * 5 * 7); //|ABD| 能同时被3,5,7整除的数的个数
        
        int CountABCD = N / (2 * 3 * 5 * 7); //|ABCD| 能同时被2,3,5,7整除的数的个数
        
        int S = N - (CountA + CountB + CountC + CountD) 
                + (CountAB + CountAC + CountAD + CountBC + CountBD + CountCD)
                - (CountABC + CountABD +  CountACD + CountBCD) 
                + CountABCD + 3;
        
        System.out.println(N+"以内的素数个数为"+S);
    }
}


结语


  属于估值法,适用于N不是特别大的情况,当N足够大时,素因子集合过大,本算法运算起来将会复杂。

相关文章

  • 集合包含排斥法求120内素数个数

    思路   1. 思想是所有的合数都可由若干个素数因子的积构成,如 18 = 2 * 3 * 3 等等。  2. 考...

  • 【python吉比特】求素数?

    题目:输入M、N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数。素数定义:除了1以外...

  • 求素数个数

    我最近在leetcode上撸了一个小算法,虽然已经工作了五年,当看到每次代码提交后排名的提升,内心依然很有成就感。...

  • 筛法求N以内的素数Java实现

    使用筛法求N以内的素数,从2开始,不断剔除2的倍数,然后从剩下的数字中,选择最小的数3(这个数一定会是素数),然后...

  • 204. Count Primes

    n以内素数的个数。 参考:埃拉托斯特尼筛法和素数判断 代码:

  • 约数-倍数法

    求1~n每个数的正约数集合-倍数法 以d为正约数的数有从1到n扫描每个数,将每个数的倍数的正约数集合都加入d。时间...

  • [蓝桥杯]用筛法求之N内的素数

    问题 1084: 用筛法求之N内的素数。 时间限制: 1Sec 内存限制: 64MB 提交: 8861 解决: 5...

  • 集合

    集合 ArrayList 集合长度count 表示集合中实际包含的元素个数;capacity 表示集合中可以包含的...

  • 2017/05/22 Python求1-100内的素数

    Python求1-100内的素数 First Day Come on ☺

  • python基础练习25-39

    26.求100之内的素数。 27.对10个数进行排序。这里用的是冒泡法 28.求一个3*3矩阵主对角线元素之和。 ...

网友评论

    本文标题:集合包含排斥法求120内素数个数

    本文链接:https://www.haomeiwen.com/subject/nokuxftx.html