问题:统计所有小于非负整数 n 的质数的数量。
一开始直接使用暴力枚举法:
public static int countPrimes(int n) {
for (int i = 2; i < n; i++) {
boolean j = isPrimes(i);
if (j) { // 不是质数
count++;
}
}
return count;
}
public static boolean isPrimes(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false; // 不是质数
}
}
return true;
}
结果:
发现在leetcode上会超出时间限制,后来看了一下题解,发现了区别:
public int countPrimes(int n) {
int count=0;
for (int i = 2; i < n; ++i) {
boolean j = isPrimes(i);
if (j) { // 不是质数
count++;
}
}
return count;
}
public boolean isPrimes(int n) {
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0) {
return false; // 不是质数
}
}
return true;
}
这样子就可以。
原因是因为,一开始在语句循环中,使用了i++,而不是++i
从字节码角度分析的话,i++比起++i多了一个创建临时变量(放入数据栈)的步骤,因此效率低一些。
使用了++i就提高了效率。