本文共 788 字,大约阅读时间需要 2 分钟。
埃氏筛法(素数筛)是一种高效地找出小于给定数字n的质数的方法。其原理是从2到n逐个检查每个数,假设当前遍历的数m是质数,那么将所有小于n的且是m倍数的数标记为非质数。遍历完成后,未被标记的数即为质数。
int countPrimes(int n) { if (n <= 2) return 0; bool* prime = new bool[n + 1]; memset(prime, true, sizeof(bool) * (n + 1)); prime[0] = prime[1] = false; for (int i = 2; i * i <= n; ++i) { if (prime[i]) { for (int j = i * i; j <= n; j += i) { prime[j] = false; } } } int count = 0; for (int i = 2; i <= n; ++i) { if (prime[i]) ++count; } delete[] prime; return count;} 减少循环次数:埃氏筛法的核心在于标记合数。通过从i=2开始遍历到sqrt(n),只处理可能的质因数,减少了循环次数。
平方优化:从i=2开始遍历到sqrt(n),后面的数已经被处理过,因此减少了循环次数。
只处理奇数:除了2以外,偶数都不是质数,因此可以从i=3开始,只处理奇数,进一步减少循环次数。
直接计算质数个数:遍历数组时直接统计质数个数,避免了重复处理,提高了效率。
通过这些优化,代码不仅更高效,而且代码结构更清晰,易于维护。
转载地址:http://oxlx.baihongyu.com/