素数判定的三种解法
做题发现暴力解法和它的升级版都会超时。。。。
//暴力解法的升级版
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;
}
这篇博客探讨了三种素数判定的方法,包括暴力解法、优化后的暴力解法以及经典的厄拉多塞筛除法。博主通过代码示例展示了如何使用厄拉多塞筛选法有效地计算一定范围内的素数数量,这种方法比暴力求解更高效,减少了计算时间。
463

被折叠的 条评论
为什么被折叠?



