常见方法:
1.暴力求素数
时间复杂度 : O(n^2) 。
【优化一下:缩小数据范围从 n 优化到√n。求开方,时间复杂度 : 自然也就从 O(n2) 到 O(√n) 】。
2.著名的埃式筛法
时间复杂度 : O(nlogn)。
3.欧拉筛法
时间复杂度为: O(n)。
下面测试筛选100以内的素数 (c#语言)
整体代码 + 模板 (方便记忆) :
class 欧拉筛
{
static void Main(String[] args)
{
int max = 100; //求100以内的素数;
List<int> prime = new List<int>(); //定义列表存储100以内的素数;
bool[] vis = new bool[max]; //判断是否已经已经标记,若标记即不是素数;
//筛选
int index = 0; //定义索引
for(int i = 2;i < max; i++) //素数最小值为2,从2开始
{
if(!vis[i])
{
prime.Add(i);
index++;
}
//两个判定:保持j在已有素数数量的范围内活动,也保持 标记数目 保证 在 最大讨论数目范围内。
for(int j = 0; j < index && prime[j] * i < max;j++)
{
vis[i * prime[j]] = true;
if (i % prime[j] == 0) //防止重复标记
{
break;
}
}
}
foreach (var k in prime)
{
Console.Write(k + " ");
}
Console.Read();
}
}
得到结果: 与答案保证一致。
有些同学对于 下面这行代码不是很了解,下面举例解释一下:
希望本文章可以帮助到正在学算法的你,若觉得本文文章不错,希望点赞收藏,若文章有错误或者不明白的地方,欢迎交流讨论~~