素数判定的三种解法
做题发现暴力解法和它的升级版都会超时。。。。
//暴力解法的升级版
public int CountPrimesFun01(int n)
{
int count = 0;
for (int i = 2; i < n; i++)
{
// 先把偶数去掉
if (i % 2 == 0 && i!= 2)
continue;
if (IsPrimeNum(i))
{
count++;
}
}
return count;
}
public bool IsPrimeNum(int tem)
{
//以 Sqrt(tem) 为分界点, 前后因子对称,因此只比较前面的即可
for (int i = 2; i <= Math.Sqrt(tem); i+= 2) //因为只有奇数了,所以,可以直接跳过偶数
{
if (tem % i == 0)
{
return false;
}
}
return true;
}
发现还有一个经典解法,厄拉多塞筛选法,,这个就比较喵了
从2开始遍历时将它的倍数给筛除掉
//厄拉多塞筛除法
public int CountPrimeFun02(int n)
{
int count = 0;
// 当tem 为true时,此时不是质数
bool[] tem = new bool[n];
for (int i = 2; i < n; i++)
{
if (!tem[i])
{
count++;
for (int j = i + i; j < n; j += i)
{
tem[j] = true;
}
}
}
return count;
}