欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 埃拉托斯特尼筛法,厄拉多塞筛算法,C#实现

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

2024/10/26 9:18:59 来源:https://blog.csdn.net/GoodCooking/article/details/140957198  浏览:    关键词:埃拉托斯特尼筛法,厄拉多塞筛算法,C#实现

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

这个 很多地方的定义不一样。
虽然名字相同,但是具体的定义还是有差距。

有的地方描述的是:
厄拉多塞筛算法(Eratosthenes Sieve)是一种求素数的方法,由古希腊数学家厄拉多塞提出。它的原理是,给定一个数n,从2开始依次将根号n以内的素数的倍数标记为合数,标记完成后,剩余未被标记的数为素数(从2开始)。如此可省去检查每个数的步骤,使筛选素数的过程更加简单。厄拉多塞筛算法具体步骤如下:
(1)读取输入的数n,将2至n的所有整数记录在表中:
(2)从2开始,划去表中所有2的倍数;
(3)由小到大寻找表中下一个未被划去的整数,再划去表中所有该整数的倍数;
(4)重复第(3)步,直到找到的整数大于根号n为止;
(5)表中所有未被划去的整数均为素数。
在这里插入图片描述

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

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

C# 实现

            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++实现

 #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;
}

输出:

i=01
i=11
i=20
i=30
i=41
i=50
i=61
i=70
i=81
i=91
i=101
Prime numbers up to 10 are: 2 3 5 7 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com