leetcode204--计算范围内的质数个数,尽可能避免循环次数

时间:2021-05-24 15:41:56   收藏:0   阅读:14

一、题目描述

计数质数

> 统计所有小于非负整数 n 的质数的数量。
>
> 示例 1:
>
> 输入:n = 10
> 输出:4
> 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
> 示例 2:
>
> 输入:n = 0
> 输出:0
> 示例 3:
>
> 输入:n = 1
> 输出:0
>
>
> 提示:
>
> 0 <= n <= 5 * 106
>

二、思路分析

public int countPrimes(int n) {
    int total = 0;
    for (int i = 2; i &lt; n; i++) {
        int j=2;
        for (j = 2; j &lt; i; j++) {
            if (i % j == 0) {
                break;
            }
        }
        if (j == i) {
            total++;
        }
    }
    return total;
}

技术分享图片

三、升级之路+AC代码

减少暴力次数

技术分享图片

\[6=\sqrt{6} * \sqrt{6} \]

public int countPrimes(int n) {
    int total = 0;
    for (int i = 2; i &lt; n; i++) {
        boolean flag = false;
        for (int j = 2; j*j &lt;= i; j++) {
            if (i % j == 0) {
                flag=true;
                break;
            }
        }
        if (!flag) {
            total++;
        }
    }
    return total;
}

埃筛法

技术分享图片

技术分享图片

技术分享图片

技术分享图片

public int countPrimes2(int n) {
    int total = 0;
    //构造同等长度的状态位数组, 默认false表示质数
    boolean[] primes = new boolean[n];
    for (int i = 2; i &lt; n; i++) {
        if (!primes[i]) {
            total++;
            for (int j = 2 * i; j &lt; n; j += i) {
                primes[j] = true;
            }
        }
    }
    return total;
}

技术分享图片

埃筛法2

技术分享图片

public int countPrimes3(int n) {
    int total = 0;
    //构造同等长度的状态位数组, 默认false表示质数
    boolean[] primes = new boolean[n];
    for (int i = 2; i &lt; n; i++) {
        if (!primes[i]) {
            total++;
            if ((long)i * i &gt;= n) {
                continue;
            }
            for (int j = i * i; j &lt; n; j += i) {
                //System.out.println("index="+j+"i="+i);
                primes[j] = true;
            }
        }
    }
    return total;
}

技术分享图片

四、总结

原文:https://www.cnblogs.com/zhangxinhua/p/14803913.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!