• 统计所有小于非负整数 n 的质数的数量,埃拉托斯特尼筛法


    素数的定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。

    1.暴力算法:

    令i=2; 当i<n的时候,我们循环找出2-i的质数,即让i%(2~i-1),如果flag为true,则i为质数,计数器++;否则跳出,i++;进行下一次判断

     public int countPrimes(int n) {
        int i=2;
    int count=0;
    boolean flag=true;
    while (i<n){
    for (int j = 2; j <i ; j++) {
    if(i%j==0){
    flag=false;
    break;
    }
    }
    if(flag) {
    count++;
    }
    flag=true;
    i++;
    }
    return count;
    }

    2.采用埃拉托斯特尼筛法,先创建一个长度为n的boolean数组,默认值都为false;我们直接从2开始判断,之后用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。每次都筛选出 i*j<n的数,置为ture,这样可以减少很多不必要的运算

    时间复杂度:O(n*lglgn)

        public static int countPrimes(int n) {
            boolean []nums=new boolean[n];
            int count=0;
            for (int i = 2; i <n ; i++) {
                if(nums[i]==false){
                    count++;
                    for (int j = 2; i*j <n ; j++) {
                        nums[i*j]=true;
                    }
                }
            }
            return count;
        }
  • 相关阅读:
    android之PackageManager简单介绍
    西门子PLC学习笔记二-(工作记录)
    node.js第十课(HTTPserver)
    ubuntu ???????????? no permissions 问题解决
    Web API 设计摘要
    公共 DNS server IP 地址
    用Unicode迎接未来
    vs2010公布时去除msvcp100.dll和msvcr100.dll图讲解明
    linux串口驱动分析
    C++ 中dynamic_cast&lt;&gt;的用法
  • 原文地址:https://www.cnblogs.com/jiezai/p/11221618.html
Copyright © 2020-2023  润新知