Leetcode204.计算质数
原题链接:
204.计算质数
枚举
从2开始,判断每个数是否为质数,并记录个数
判断质数
bool isPrime(int n)
{
for (int i = 2; i*i <= n; ++i)
{
if (n % i == 0)
return false;
}
return true;
}
//计数
int countPrimes(int n)
{
int count = 0;
for (int i = 2; i < n; ++i)
{
if (isPrime(i))
{
++count;
}
}
return count;
}
这个方法超时了,时间复杂度为n倍的根号下的n,因为判断每个数是否为质数的时间复杂度为根号下的n。
埃氏筛
埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
如果一个数nums为质数,那么它的倍数:2nums, 3nums…都为合数。
所以利用一个只表示标记的数组,这个标记记录每个数是否为质数,是否为合数。如果遍历到的数为质数,就把他所有的倍数置为合数。
int countPrimes(int n)
{
//申请数组,先全部置为质数
bool* isPrime = (int*)malloc(sizeof(int) * n);
memset(isPrime, true, sizeof(int) * n);
int count = 0;
for (int i = 2; i < n; ++i)
{
if (isPrime[i]) //如果是质数
{
++count;
if ((long long) i * i < n)
{
//是质数,就将他的倍数置为合数
for (int j = i * i; j < n; j += i)
{
isPrime[j] = false;
}
}
}
}
return count;
}
只超过了少数人。。。
感谢大家收看~~