Skip to content

Commit 36f59b6

Browse files
L-WWEEIIlabuladong
authored andcommitted
Update 打印素数.md
增加了C++版本的代码
1 parent bc14b2e commit 36f59b6

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

高频面试系列/打印素数.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,4 +178,41 @@ int countPrimes(int n) {
178178
<img src="../pictures/qrcode.jpg" width=200 >
179179
</p>
180180

181-
======其他语言代码======
181+
======其他语言代码======
182+
183+
C++解法:
184+
采用的算法是埃拉托斯特尼筛法
185+
埃拉托斯特尼筛法的具体内容就是:**要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。**
186+
同时考虑到大于2的偶数都不是素数,所以可以进一步优化成:**要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的奇数倍剔除,剩下的奇数就是素数。**
187+
此算法其实就是上面的Java解法所采用的。
188+
189+
这里提供C++的代码:
190+
```C++
191+
class Solution {
192+
public:
193+
int countPrimes(int n) {
194+
int res = 0;
195+
bool prime[n+1];
196+
for(int i = 0; i < n; ++i)
197+
prime[i] = true;
198+
199+
for(int i = 2; i <= sqrt(n); ++i) //计数过程
200+
{ //外循环优化,因为判断一个数是否为质数只需要整除到sqrt(n),反推亦然
201+
if(prime[i])
202+
{
203+
for(int j = i * i; j < n; j += i) //内循环优化,i*i之前的比如i*2,i*3等,在之前的循环中已经验证了
204+
{
205+
prime[j] = false;
206+
}
207+
}
208+
}
209+
for (int i = 2; i < n; ++i)
210+
if (prime[i]) res++; //最后遍历统计一遍,存入res
211+
212+
return res;
213+
}
214+
};
215+
```
216+
217+
218+

0 commit comments

Comments
 (0)