题解《算法零基础100讲》(第8讲) 素数筛选(java版)

Posted 敲代码的xiaolang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解《算法零基础100讲》(第8讲) 素数筛选(java版)相关的知识,希望对你有一定的参考价值。

😁算法小白欢迎加入此社区https://bbs.csdn.net/forums/hero?category=0
由英雄大佬带领的抱团学算法队伍,从0开始,期待你的加入🥳

本博文是对此文章习题所作的题解,如有不足,请多指教
https://blog.csdn.net/WhereIsHeroFrom/article/details/120875259

先对英雄的讲解文章里的代码进行记录整理

文中的题解是使用的 Eratosthenes 筛选法,大概的意思是:

先定义一个标记数组,比如是f[max],我们让f[i] = 0表示 i 为素数,否则为非负数,首先由于0和1都不是素数,那么我们让f[0]和f[1]均为1。
a.我们找到数字2,是素数,那么我们把2的倍数也就是 4、6、8等等的f[i]都标记为 1 。
b.然后再找未被标记的最小数,也就是3,同理6、9、12…等等的f[i]都标记为1。
c.如此遍历下去,遍历完标记数组,如果没有被标记为1的数,那么就是素数了。

代码实现:

#define maxn 5000001                           
#define ll long long                     /*避免i*i超出整型后变成负数。*/        

bool f[maxn];                                 

int countPrimes(int n){
    int i;
    int cnt = 0;                                
    ll j;                                       
    f[0] = f[1] = 1;                          
    for(i = 2; i < n; ++i) {
        if(!f[i]) {
            ++cnt;                              
            for(j = (ll)i * i; j < n; j += i) {  
                f[j] = 1;                       
            }
        }
    }
    return cnt;
}

/*代码转载自:https://blog.csdn.net/WhereIsHeroFrom/article/details/120875259*/

分析见下面:

今日题解:
题目:https://leetcode-cn.com/problems/count-primes/

一样的模板,上面分析了很多,这里直接出击!

class Solution {
    public int countPrimes(int n) {
        int i;
        int cnt = 0;                                 
        long  j;
        boolean[] f = new boolean[5000001];
        f[0] = f[1] = true;                             
        for(i = 2; i < n; ++i) {
            if(!f[i]) {
                ++cnt;                               
                for(j = (long) i * i; j < n; j += i) {  
                    f[Math.toIntExact(j)] = true;                        
                }
            }
        }
        return cnt;
    }
}

有问题欢迎留言,欢迎加入“万人千题”社区,在这里一起努力。

以上是关于题解《算法零基础100讲》(第8讲) 素数筛选(java版)的主要内容,如果未能解决你的问题,请参考以下文章

《算法零基础100例》(第8例) 素数筛选

题解《算法零基础100讲》(第6讲) 日期算法(java版)

题解《算法零基础100讲》(第16讲) 变量交换算法(java版)

题解《算法零基础100讲》(第7讲---丑数) (java版)

题解《算法零基础100讲》(第17讲) 线性枚举 - 最值算法(java版)

题解《算法零基础100讲》(第9讲) 算术基本定理(java版)