C/C++查找一定范围内的素数(筛法)
2011-05-22 16:51
267 查看
刚在网上找到了一篇讲述查找一定范围内素数的算法文章,觉得很不错,通俗易懂。
本文转自:http://dalu.blogbus.com/logs/37977984.html
由于一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。
例如要查找100以内的质数,首先2是质数,把2的倍数去掉;此时3没有被去掉,可认为是质数,所以把3的倍数去掉;再到5,再到7,7之后呢,因为8,9,10刚才都被去掉了,而100以内的任意合数肯定都有一个因子小于10(100的开方),所以,去掉,2,3,5,7的倍数后剩下的都是质数了。
用程序可以这样解决,引入布尔类型数组a[i],如果i是质数,a[i]=true,否则a[i]=false。那么划掉i可以表示成a[i]=false。
如果去掉最后一个用来显示结果的循环的话,运行Sieve(10000000)只要1秒多,而上次那个算法PrimeNum(10000000)却要71秒多!
本文转自:http://dalu.blogbus.com/logs/37977984.html
由于一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。
例如要查找100以内的质数,首先2是质数,把2的倍数去掉;此时3没有被去掉,可认为是质数,所以把3的倍数去掉;再到5,再到7,7之后呢,因为8,9,10刚才都被去掉了,而100以内的任意合数肯定都有一个因子小于10(100的开方),所以,去掉,2,3,5,7的倍数后剩下的都是质数了。
用程序可以这样解决,引入布尔类型数组a[i],如果i是质数,a[i]=true,否则a[i]=false。那么划掉i可以表示成a[i]=false。
//找出n以内质数 void Sieve(int n) { bool[] a = new bool[n+1]; for (int i = 2; i <= n; i++) a[i] = true; for (int i = 2; i <= Math.Sqrt(n); i++) { if (a[i]) for (int j = i; j*i <= n; j++) a[j * i] = false; } for (int i = 0; i <= n; i++) { if (a[i]) Console.Write("{0},",i.ToString()); } }
如果去掉最后一个用来显示结果的循环的话,运行Sieve(10000000)只要1秒多,而上次那个算法PrimeNum(10000000)却要71秒多!
相关文章推荐
- C/C++查找一定范围内的素数(筛法)
- C++练习之 素数系列(判断单个数是否为素数,输出一定范围的素数,循环判断素数)
- C++在一定范围内生成不重复随机数序列
- 筛选法查找1000以内的素数c++代码实例及运行结果
- 求一定范围内的素数
- 筛选法查找1000以内的素数c++代码实例及运行结果
- java小程序之打印一定范围内的素数
- linux查找一定时间范围内的shell文件
- c++ 依次存放在指定范围内求出的所有素数
- C/C++练习7---求某个范围内的所有素数
- Python_判断一定范围内的数据的素数
- 筛选法查找1000以内的素数c++代码实例及运行结果
- C/C++练习7---求某个范围内的所有素数
- 1137C/C++经典程序训练7---求某个范围内的所有素数
- 筛选法查找1000以内的素数c++代码实例及运行结果
- Problem D: C/C++经典程序训练7---求某个范围内的所有素数
- 筛选法查找1000以内的素数c++代码实例及运行结果
- 查找某个值在在数组中哪个位置,不一定这个值在这个数组中,只要这个值在这个数组范围中就可以(常用于根据经验值获取等级)
- NYOJ 快速查找素数问题(筛法)
- C/C++练习7---求某个范围内的所有素数 (sdut oj)