在一个公众号中看到,觉得确实巧妙,于是在这里记录分享。
素数也叫质数,只有1和它自身两个约数,也就是说不能被2~n-1的数整除,那么如何求100以内的所有素数?看到这里你可能会觉得这个问题并不难,反手就扔过来你的算法:
class Program
{
static void Main(string[] args)
{
GetPrime(20);
}
static void GetPrime(int n)
{
for (int i = 2; i <= n; i++)
{
if (isPrime(i))
{
WriteLine(i + " ");
}
}
}
//判断num是否为素数
static bool isPrime(int num)
{
for (int i = 2; i <= num - 1; i++)
{
if (num % i == 0)
{
return false;
}
}
return true;
}
}
先看看这个过程,简洁流畅,十分容易理解,不过我们看一下时间复杂度,这里是O(n^2),有没有可以优化的方法?最容易想到的一个优化方案是将内层循环的2~num-1改为Sqrt(n),因为既然是约数,那么它一定是对称出现的,例如12的约数2*6,3*4,Sqrt(n)*Sqrt(n),这一点应该不难理解,内存循环时间复杂度降低为O(Sqrt(n)):
<