0
点赞
收藏
分享

微信扫一扫

欧拉筛——查找素数(质数)的最优解算法 O(n)

我是芄兰 2022-05-04 阅读 89

常见方法:

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();
        }
    }

得到结果: 与答案保证一致。

有些同学对于 下面这行代码不是很了解,下面举例解释一下:

希望本文章可以帮助到正在学算法的你,若觉得本文文章不错,希望点赞收藏,若文章有错误或者不明白的地方,欢迎交流讨论~~

举报

相关推荐

0 条评论