44
44
45
45
<!-- 这里可写通用的实现逻辑 -->
46
46
47
- 如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,… 一定不是质数,因此我们可以从这里入手。
47
+ ** 方法一:埃氏筛 **
48
48
49
- 我们设 ` primes[i] ` 表示数 i 是不是质数,如果是质数则为 true,否则为 false。从小到大遍历每个数,如果这个数为质数,则将其所有的倍数都标记为合数(除了该质数本身),即 false,这样在运行结束的时候我们即能知道质数的个数 。
49
+ 如果 $x$ 是质数,那么大于 $x$ 的 $x$ 的倍数 $2x$,$3x$,… 一定不是质数,因此我们可以从这里入手 。
50
50
51
- 对于一个质数 x,我们从 2x 开始标记其实是冗余的,应该直接从 x⋅x 开始标记,因为 2x,3x,… 这些数一定在 x 之前就被其他数的倍数标记过了,例如 2 的所有倍数,3 的所有倍数等。
51
+ 我们设 $primes[ i] $ 表示数 $i$ 是不是质数,如果是质数则为 $true$,否则为 $false$。从小到大遍历每个数,如果这个数为质数,则将其所有的倍数都标记为合数(除了该质数本身),即 $false$,这样在运行结束的时候我们即能知道质数的个数。
52
+
53
+ 时间复杂度 $O(nloglogn)$。
52
54
53
55
<!-- tabs:start -->
54
56
59
61
``` python
60
62
class Solution :
61
63
def countPrimes (self , n : int ) -> int :
62
- if n < 2 :
63
- return 0
64
- res = 0
65
- primes = [True for _ in range (n)]
64
+ primes = [True ] * n
65
+ ans = 0
66
66
for i in range (2 , n):
67
67
if primes[i]:
68
- res += 1
69
- for j in range (i * i, n, i):
68
+ ans += 1
69
+ for j in range (i + i, n, i):
70
70
primes[j] = False
71
- return res
71
+ return ans
72
72
```
73
73
74
74
### ** Java**
@@ -78,21 +78,105 @@ class Solution:
78
78
``` java
79
79
class Solution {
80
80
public int countPrimes (int n ) {
81
- if (n < 2 ) return 0 ;
82
81
boolean [] primes = new boolean [n];
83
82
Arrays . fill(primes, true );
84
- int res = 0 ;
83
+ int ans = 0 ;
85
84
for (int i = 2 ; i < n; ++ i) {
86
85
if (primes[i]) {
87
- ++ res;
88
- if ((long ) i * i < n) {
89
- for (int j = i * i; j < n; j += i) {
90
- primes[j] = false ;
91
- }
86
+ ++ ans;
87
+ for (int j = i + i; j < n; j += i) {
88
+ primes[j] = false ;
89
+ }
90
+ }
91
+ }
92
+ return ans;
93
+ }
94
+ }
95
+ ```
96
+
97
+ ### ** C++**
98
+
99
+ ``` cpp
100
+ class Solution {
101
+ public:
102
+ int countPrimes(int n) {
103
+ vector<bool > primes(n, true);
104
+ int ans = 0;
105
+ for (int i = 2; i < n; ++i)
106
+ {
107
+ if (primes[ i] )
108
+ {
109
+ ++ans;
110
+ for (int j = i + i; j < n; j += i) primes[ j] = false;
111
+ }
112
+ }
113
+ return ans;
114
+ }
115
+ };
116
+ ```
117
+
118
+ ### **Go**
119
+
120
+ ```go
121
+ func countPrimes(n int) int {
122
+ primes := make([]bool, n)
123
+ for i := range primes {
124
+ primes[i] = true
125
+ }
126
+ ans := 0
127
+ for i := 2; i < n; i++ {
128
+ if primes[i] {
129
+ ans++
130
+ for j := i + i; j < n; j += i {
131
+ primes[j] = false
132
+ }
133
+ }
134
+ }
135
+ return ans
136
+ }
137
+ ```
138
+
139
+ ### ** JavaScript**
140
+
141
+ ``` js
142
+ /**
143
+ * @param {number} n
144
+ * @return {number}
145
+ */
146
+ var countPrimes = function (n ) {
147
+ let primes = new Array (n).fill (true );
148
+ let ans = 0 ;
149
+ for (let i = 2 ; i < n; ++ i) {
150
+ if (primes[i]) {
151
+ ++ ans;
152
+ for (let j = i + i; j < n; j += i) {
153
+ primes[j] = false ;
154
+ }
155
+ }
156
+ }
157
+ return ans;
158
+ };
159
+ ```
160
+
161
+ ### ** C#**
162
+
163
+ ``` cs
164
+ public class Solution {
165
+ public int CountPrimes (int n ) {
166
+ var notPrimes = new bool [n ];
167
+ int ans = 0 ;
168
+ for (int i = 2 ; i < n ; ++ i )
169
+ {
170
+ if (! notPrimes [i ])
171
+ {
172
+ ++ ans ;
173
+ for (int j = i + i ; j < n ; j += i )
174
+ {
175
+ notPrimes [j ] = true ;
92
176
}
93
177
}
94
178
}
95
- return res ;
179
+ return ans ;
96
180
}
97
181
}
98
182
```
0 commit comments