题解《算法零基础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讲》(第6讲) 日期算法(java版)
题解《算法零基础100讲》(第16讲) 变量交换算法(java版)
题解《算法零基础100讲》(第7讲---丑数) (java版)