java - 了解埃拉托色尼筛算法的修改变体
问题描述
我在一个编码站点(没有作者的信息)上遇到了这个算法,它计算了所有小于给定限制的素数。它看起来与 SoE 算法非常相似,但它计算素数的方式不同:
public int countPrimes(int n) {
if (n < 3) return 0;
boolean[] s = new boolean[n];
int c = n / 2;
for (int i = 3; i < Math.sqrt(n); i += 2) {
if (s[i]) continue;
for (int j = i * i; j < n; j += 2 * i) {
if (!s[j]) {
c--;
s[j] = true;
}
}
}
return c;
}
它将初始计数设置为限制的一半,然后将其递减,但我似乎无法理解为什么会这样。谁能解释一下?
解决方案
计数被初始化为 n/2,因为所有偶数(2 除外)都不是素数。然后下面的循环可以从 3 的倍数开始检查。如果找到新的非素数 (!s[j]),则减少素数 (c) 的计数。
推荐阅读
- c++ - 有没有办法将“constexpr”值传递给 lambda,使其在 lambda 中保持“constexpr”?
- c++ - std::tuple 相当于 std::pair 的第二个成员?
- .htaccess - 如何将旧式帖子重定向到新的 URL 格式?
- android - 接下来关注 RecyclerView 中的自定义视图
- node.js - 将特定文件保留在 pkg 可执行文件之外(node.js - restify - pkg)
- php - 如何通过单击php中的按钮来激活注册用户
- ruby-on-rails - 使用 UUID 的 Rails 5 迁移
- doctrine-orm - 日历中的重复事件
- css - 响应式水平全屏滚动 div
- regex - PCRE 正则表达式匹配 /x... 但不是 /y/x