埃拉托斯特尼筛法,厄拉多塞筛算法,C#实现

埃拉托斯特尼筛法,厄拉多塞筛算法

这个 很多地方的定义不一样。

虽然名字相同,但是具体的定义还是有差距。

有的地方描述的是:

厄拉多塞筛算法(Eratosthenes Sieve)是一种求素数的方法,由古希腊数学家厄拉多塞提出。它的原理是,给定一个数n,从2开始依次将根号n以内的素数的倍数标记为合数,标记完成后,剩余未被标记的数为素数(从2开始)。如此可省去检查每个数的步骤,使筛选素数的过程更加简单。厄拉多塞筛算法具体步骤如下:

(1)读取输入的数n,将2至n的所有整数记录在表中:

(2)从2开始,划去表中所有2的倍数;

(3)由小到大寻找表中下一个未被划去的整数,再划去表中所有该整数的倍数;

(4)重复第(3)步,直到找到的整数大于根号n为止;

(5)表中所有未被划去的整数均为素数。

差距就是有的是根号N,有的是N。

下面实现的是没有根号的版本。

C# 实现

csharp 复制代码
            var ll = SieveOfEratosthenes(10);
            ll.ForEach(e => { Console.WriteLine(e); });

        /// <summary>
        /// 埃拉托斯特尼筛法
        /// </summary>
        /// <param name="maxValue">最大值</param>
        /// <returns>符合条件的素数集合</returns>
        private static List<int> SieveOfEratosthenes(int maxValue)
        {
            List<bool> bl_list = new List<bool>();
            List<int> int_list = new List<int>();

            // 初始化 bl_list,默认值为 false(表示是质数)
            for (int i = 0; i < maxValue + 1; i++)
            {
                bl_list.Add(false);
            }

            // 0 和 1 不是质数
            bl_list[0] = true;
            bl_list[1] = true;

            // 开始筛选
            for (int i = 2; i * i <= maxValue; i++)
            {
                if (!bl_list[i])
                {
                    for (int j = i * i; j <= maxValue; j += i)
                    {
                        bl_list[j] = true; // 标记为非质数
                    }
                }
            }

            // 收集所有质数
            for (int i = 2; i <= maxValue; i++)
            {
                if (!bl_list[i])
                {
                    int_list.Add(i);
                }
            }

            // 打印结果(可选)
            for (int i = 0; i < bl_list.Count; i++)
            {
                Console.WriteLine($"i={i}:" + bl_list[i]);
            }

            return int_list;
        }

输出:

复制代码
i=0:True
i=1:True
i=2:False
i=3:False
i=4:True
i=5:False
i=6:True
i=7:False
i=8:True
i=9:True
i=10:True
2
3
5
7

C++实现

cpp 复制代码
 #include <iostream>
#include <vector>

std::vector<int> SieveOfEratosthenes(int maxValue) {
    std::vector<bool> bl_list(maxValue + 1, false); // 初始化 bl_list,默认值为 false(表示是质数)
    std::vector<int> int_list;

    // 0 和 1 不是质数
    bl_list[0] = true;
    bl_list[1] = true;

    // 开始筛选
    for (int i = 2; i * i <= maxValue; i++) {
        if (!bl_list[i]) {
            for (int j = i * i; j <= maxValue; j += i) {
                bl_list[j] = true; // 标记为非质数
            }
        }
    }

    // 收集所有质数
    for (int i = 2; i <= maxValue; i++) {
        if (!bl_list[i]) {
            int_list.push_back(i);
        }
    }

    // 打印结果(可选)
    for (int i = 0; i < bl_list.size(); i++) {
        std::cout << "i=" << i << ":" << bl_list[i] << std::endl;
    }

    return int_list;
}

int main() {
    int maxValue = 10; //查找10以内的 
    std::vector<int> primes = SieveOfEratosthenes(maxValue);

    std::cout << "Prime numbers up to " << maxValue << " are: ";
    for (int prime : primes) {
        std::cout << prime << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

javascript 复制代码
i=0:1
i=1:1
i=2:0
i=3:0
i=4:1
i=5:0
i=6:1
i=7:0
i=8:1
i=9:1
i=10:1
Prime numbers up to 10 are: 2 3 5 7 
相关推荐
天若有情6733 分钟前
打破思维定式!C++参数设计新范式:让结构体替代传统参数列表
java·开发语言·c++
初晴や5 分钟前
【C++】图论:基础理论与实际应用深入解析
c++·算法·图论
李泽辉_5 分钟前
深度学习算法学习(五):手动实现梯度计算、反向传播、优化器Adam
深度学习·学习·算法
斯特凡今天也很帅6 分钟前
python测试SFTP连通性
开发语言·python·ftp
sunywz8 分钟前
【JVM】(4)JVM对象创建与内存分配机制深度剖析
开发语言·jvm·python
亲爱的非洲野猪9 分钟前
从ReentrantLock到AQS:深入解析Java并发锁的实现哲学
java·开发语言
星火开发设计9 分钟前
C++ set 全面解析与实战指南
开发语言·c++·学习·青少年编程·编程·set·知识
李泽辉_21 分钟前
深度学习算法学习(一):梯度下降法和最简单的深度学习核心原理代码
深度学习·学习·算法
꧁Q༒ོγ꧂24 分钟前
算法详解---大纲
算法
沛沛老爹25 分钟前
Web开发者进阶AI:Agent Skills-深度迭代处理架构——从递归函数到智能决策引擎
java·开发语言·人工智能·科技·架构·企业开发·发展趋势