是这样的,这题我试着用“线性筛”的方法进行求解,在解题的过程中发现了这样一个问题,令我很困惑,首先一个代码如下
```java
class Solution {
public int countPrimes(int n) {
//存放质数的集合
int[] primes = new int[n+1];
int num = 0;
//标记是否为质数
boolean[] bp = new boolean[n+1];
for (int i = 2; i < n; i++) {
if (!bp[i]){
primes[num++] = i;
}
for(int j = 0;j < num ;j++){
if( i * primes[j] < n){
bp[i*primes[j]] = true;
}
// **关键点在这里**
if (i % primes[j] == 0) {
break;
}
}
}
return num;
}
}
可以看到,在这里int类型的运算超出表示范围了,所以报错了,但是,如果换一种写法,如下:
class Solution {
public int countPrimes(int n) {
//存放质数的集合
int[] primes = new int[n+1];
int num = 0;
//标记是否为质数
boolean[] bp = new boolean[n+1];
for (int i = 2; i < n; i++) {
if (!bp[i]){
primes[num++] = i;
}
for(int j = 0;j < num && i * primes[j] < n;j++){
bp[i*primes[j]] = true;
if (i % primes[j] == 0) {
break;
}
}
}
return num;
}
}
也就是把判断放到for循环的判断语句里了,结果如下:
所以说判断语句放在for循环的循环体里和放在for循环的判断语句里是有所不同的吗?
到底有什么不同呢?希望有人能帮我答疑解惑