Easy
1203432FavoriteShare
Count the number of prime numbers less than a non-negative number, n.
Example:
Input: 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
利用已知素数找下一个素数法:
C++:
/*
* @Author: SourDumplings
* @Date: 2019-08-17 14:20:07
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/count-primes/
*
* 注意判断素数,除数的平方大于被除数就没必要再增大除数了
*/
class Solution
{
public:
int countPrimes(int n)
{
if (n == 3)
{
return 1;
}
else if (n < 3)
{
return 0;
}
vector<int> primes;
primes.push_back(2);
primes.push_back(3);
while (primes.back() < n)
{
get_next_prime(primes);
}
return primes.size() - 1;
}
void get_next_prime(vector<int> &primes)
{
int start = primes.back();
for (int i = start + 2;; i += 2)
{
bool isPrime = true;
for (auto it = primes.begin() + 1; it != primes.end(); ++it)
{
int j = *it;
if (i % j == 0)
{
isPrime = false;
break;
}
if (j * j > i)
{
break;
}
}
if (isPrime)
{
primes.push_back(i);
break;
}
}
}
};
埃式筛法获得素数表:
C++:
/*
* @Author: SourDumplings
* @Date: 2019-08-17 14:20:07
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/count-primes/
*
* 利用埃式筛法,将合数都覆盖掉便得到素数表
*/
class Solution
{
public:
int countPrimes(int n)
{
if (n == 3)
{
return 1;
}
else if (n < 3)
{
return 0;
}
bool isPrime[n];
fill(isPrime, isPrime + n, true);
isPrime[0] = isPrime[1] = false;
for (int i = 4; i < n; i += 2)
{
isPrime[i] = false;
}
for (int i = 3; i * i < n; i += 2)
{
if (isPrime[i])
{
for (int j = 2; j * i < n; ++j)
{
isPrime[i * j] = false;
}
}
}
return count(isPrime, isPrime + n, true);
}
};
Java:
/*
* @Author: SourDumplings
* @Date: 2019-08-17 15:11:38
* @Link: https://github.com/SourDumplings/
* @Email: changzheng300@foxmail.com
* @Description: https://leetcode.com/problems/count-primes/
*/
class Solution
{
public int countPrimes(int n)
{
if (n == 3)
{
return 1;
}
else if (n < 3)
{
return 0;
}
boolean[] isPrime = new boolean[n];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i < n; i += 2)
{
isPrime[i] = false;
}
int res = 1;
for (int i = 3; i * i < n; i += 2)
{
if (isPrime[i])
{
for (int j = i + i; j < n; j += i)
{
isPrime[j] = false;
}
}
}
for (int i = 2; i < n; i++)
{
if (isPrime[i])
{
++res;
}
}
return res;
}
}