Description:
Count the number of prime numbers less than a non-negative number, n.
即求小于给定的正整数n的所有素数的个数
方法一:普通求解法,即从2开始判断每一个小于你的正整数k是否是素数,用k依次对2到根号k之间的所有整数取余,如果余数为0则k为非素数,否则为素数
public int countPrimes(int n) {
// 常规解法,一个个的判断,执行效率低,超时
if(n < 3)
return 0;
int count = 0;
int m = 2;
while(m < n)
{
int k = 2;
int sqrt = (int) Math.sqrt(n);
while(k <= sqrt)
{
if(m % k == 0)
break;
k++;
}
if(k == sqrt + 1)
count++;
m++;
}
return count;
}
方法二:以乘法替代除法,依次将2到根号n之间的整数的所有倍数(在小于n的范围内)标记为非素数,剩余的没有被标记的数就全部都是素数了
public int countPrimes(int n) {
// 新建一个同样大小的数组,记录其是否是素数
// 注意,2是素数
boolean[] results = new boolean[n];
for(int i = 2; i * i < n; i++) {
// 将素数的倍数全部标记为非素数
if(!results[i]) {
for(int j = i; i * j < n; j++) {
results[i * j] = true;
}
}
}
int count = 0;
for(int i = 2; i < n; i++) {
if(results[i] == false)
count++;
}
return count;
}
方法二没有除法运算,因而执行速度较方法一要快很多