题目描述
题干:
统计所有小于非负整数 n 的质数的数量。
示例1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例2:
输入:n = 0
输出:0
示例3
输入:n = 1
输出:0
题解思路
计算质数,刚开始接触就学的算法,一开始做的就是循环算,再加上根号简化目标,现在无非是计算质数的个数,就可以写个count记录
按照常规的思路写来是没问题,不过有事超出时间限制,现在很多常规的思路都应该打破了,这里官方题解除了我们那个枚举的方法,又给了一个埃氏筛的方法
这里得提一下,虽然我们一开始想到的叫做枚举方法,但是评论区的一个方法才是真正的枚举方法,以前有道题总是有人列出所有的结果,面向结果编程
但是这次他给的范围0 <= n <= 5 * 10^6,你总不能都列出来吧,但是他根据每次的提示用例都给测出来了,我直呼好家伙,直接超过100%
言归正传,咱说一下埃氏筛方法,他的思路就是一个数就算是质数,但是他的倍数总不能是吧,他的倍数称为合数,那这样我们从头开始,每个数就开始加自己的倍数
这样遍历完之后,剩下那些标志出来的就是合数,就可以淘汰了,剩下的就是质数了,这里用一个数组存储1或者0来标志就行了,代码如下
正确代码
class Solution {
public int countPrimes(int n) {
int[] isPrime = new int[n];
Arrays.fill(isPrime, 1);
int count = 0;
for (int i = 2; i < n; ++i) {
if (isPrime[i] == 1) {
count += 1;
}
//????
if ((long)i * i < n) {
for (int j = i * i; j < n; j += i){
isPrime[j] = 0;
}
}
}
return count;
}
}
总结
代码中我注释了有一个有疑惑的地方,那里的long强转我不知道它的作用,不加的话会报错,因为后来的j + i会造成下标越界
难道是害怕超过int的范围?但是这里也没超过呀,其他的写法也都是加这个强转
如果有大牛路过希望可以顺手帮我解释一下,文章如果还有其他问题也希望可以评论一起学习,各自努力,你我最高处见