leetcode 204 count prim 数素数
描述:
给个整数n,计算小于n的素数个数。
思路:
埃拉托斯特尼筛法,其实就是普通筛子,当检测到2是素数,去除所有2的倍数;当检测到3是素数,去除其倍数。
不过这要求空间复杂度为n,时间复杂度为n。
解决:
int countPrimes(int n) { if (n < 3) return 0; int count = 1; bool* no = new bool[n]{n, false}; for(int i = 3; i < n; i+=2) { if (!no[i]) { count++; long j = (long)i * i; for (; j < n; j += i*2) // 此处优化重要! no[j] = true; } } return count; }
有几个注意的地方。
1. no数组用new,不要用vector,由于操作简单。
2. 更新时,从i * i开始,比i小的数,都给比i小的质数给更新了。
3. 每次步进2i,如果一次步进i,则为2i,偶数。
【本文章出自博客园willaty,转载请注明作者出处,误差欢迎指出~】