该算法在寻找素数时,采用了一种不同凡响的方法:先将 2-N 的各数放入表中,而后在 2 的上面画一个圆圈,而后划去 2 的其余倍数;第一个既未画圈又没有被划去的数是 3,将它画圈,再划去 3 的其余倍数;如今既未画圈又没有被划去的第一个数是 5,将它画圈,并划去5的其余倍数……依次类推,一直到全部小于或等于N的各数都画了圈或划去为止。算法
这时,表中画了圈的以及未划去的那些数正好就是小于 N 的素数。数组
所以代码以下:bash
public int countPrimes(int n) {
//创建数组
boolean[] nums = new boolean[n];
//将2-N之间的数据设为true
for (int i = 2;i<n;i++){
nums[i] = true;
}
//将二、三、5等倍数的值“划去”(设为false)
for (int i = 2;i*i < n;i++) {
if (nums[i]) {
for (int j = 2;j*i<n;j++) {
nums[j*i] = false;
}
}
}
int res = 0;
//最后取出为true的值,即为2-N之间画圈的数据
for (boolean num : nums) {
res+= num?1:0;
}
return res;
}
复制代码