筛选法

介绍:

筛选法又称筛法,是求不超过自然数N(N>1)的所有质数的一种方法。据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274~194年)发明的,又称埃拉托斯特尼筛子。

具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。)

用C++实现筛选法:

以通过筛选法求100以内的素数为例

#include<iostream>
using namespace std;
int main()
{
int i,j,a[101];//这里定义101大小的数组,是为了和自然数相对应,即:a[2]对应自然数2
for(i=2;i<100;i++)
a[i]=1;//完成对数组的初始化操作
for(i=2;i<100;i++){
for(j=2*i;j<100;j+=i){
a[j]=0;//对相应的倍数进行排除
}
}
//执行输出操作
for(i=2;i<100;i++){
if(a[i])
cout<<i<<'\t';
}
cout<<endl;
return 0;
}

一些思考和优化

以前学习计算素数的算法的时候,有一个比较普遍的优化的算法。

也就是用

for(i=1;i<(j/2);i++)

或者

for(i=1;i<sqrt(j);i++)//使用sqrt()函数需要引入math.h这个头文件

来替代

for(i=1;i<j;i++)

可以显著的降低算法的复杂度

一开始直接使用,不知道是什么原理。后来看了看,原来原理是这样的:

以sqrt(j)代替i为例

求素数最基本的方法,是用i去除以2到j-1之间的所有的整数,如果有可以整除的情况,则不是素数;如果都不可以整除,则是素数。

而i=sqrt(j)*sqrt(j)

我们用i去除以2到sqrt(j)之间的所有的整数,这就可以覆盖2到i-1之间的所有的整数。

设2<k<sqrt(j),则若j%k==0,则sqrt(j)<m=(j%k)<j-1。

也就是说,因为是除法运算求整除的运算,所以除以小的可以整除,可就是除以相应的大的可以整除。

优化之后的代码:

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int i,j,a[101];//这里定义101大小的数组,是为了和自然数相对应,即:a[2]对应自然数2
for(i=2;i<100;i++)
a[i]=1;//完成对数组的初始化操作
for(i=2;i<sqrt(100);i++){
for(j=2*i;j<100;j+=i){
a[j]=0;//对相应的倍数进行排除
}
}
//执行输出操作
for(i=2;i<100;i++){
if(a[i])
cout<<i<<'\t';
}
cout<<endl;
return 0;
}

C++实现筛选法的更多相关文章

  1. java筛选法求素数

    这本身没什么,代码一堆 发来纪念下而已 本来刚学习java,编写输出100以内的素数 对于我这个有代码运行性能洁癖的人(但是本身又不懂算法)来说,不能忍 于是看了些资料 参考: http://blog ...

  2. Eratosthenes筛选法构造1-n 素数表

    筛选法:对于不超过n的每个非负整数p,删除2p,3p,4p...当处理完所有数之后,还没没删除的就是素数. 代码中进行了相应的优化. 本代码功能,输入一个数,输出从1-该数之间的素数.功能待完善,可将 ...

  3. ACM/ICPC 之 数论-素数筛选法 与 "打表"思路(POJ 1595)

    何为"打表"呢,说得简单点就是: 有时候与其重复运行同样的算法得出答案,还不如直接用算法把这组数据所有可能的答案都枚举出来存到一个足够大的容器中去-例如数组(打表),然后再输入数据 ...

  4. HDU1215(筛选法)

    题意:求n的所有因子和: 思路:类似于筛选法求素数的思想,只有第一次的时候了解过它的思想,然后就只是用来求素数,思想的运用反而少: 筛选法求素数: int prime() { memset(vis, ...

  5. POJ 3978 Primes(素数筛选法)

    题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include< ...

  6. POJ 2689 Prime Distance (素数筛选法,大区间筛选)

    题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...

  7. 【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N ...

  8. LightOJ 1259 Goldbach`s Conjecture (哥德巴赫猜想 + 素数筛选法)

    http://lightoj.com/volume_showproblem.php?problem=1259 题目大意:给你一个数n,这个数能分成两个素数a.b,n = a + b且a<=b,问 ...

  9. HDU 2136 Largest prime factor(查找素数,筛选法)

    题目梗概:求1000000以内任意数的最大质因数是第几个素数,其中 定义 1为第0个,2为第1个,以此类推. #include<string.h> #include<stdio.h& ...

  10. poj 2262 Goldbach's Conjecture(素数筛选法)

    http://poj.org/problem?id=2262 Goldbach's Conjecture Time Limit: 1000MS   Memory Limit: 65536K Total ...

随机推荐

  1. 关于js冒泡、捕获、以及阻止冒泡

    有如下html <ul> <li> <p> <a href="javascript:;">click me</a> &l ...

  2. Unity3D 自动寻路入门指南

    所有用于成为NavMesh的网格都必须被指定为 Navigation Static . 方法如下,选中GameObject,然后在菜单栏的[Window]-[Navigation]-[Object]- ...

  3. svn代码回滚命令 svn up -r

    第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [-R] something 其中so ...

  4. 修改vmware中的FreeBSD配置

    在运行虚拟机之前,将操作系统安装文件挂载到CD-ROM中,然后,启动虚拟机,并用root用户进入操作系统.做如下操作: 1:挂载光盘文件: #mount /cdrom 2:运行系统安装程序,就可以显示 ...

  5. Linux中sort和uniq关于排序去重的那些用法

    相信在Linux下对文件操作经常会用到sort和uniq命令,下面系统的介绍一下这两个命令的用法. sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出.sort命令既可以从特 ...

  6. java-04类和对象课堂练习

    1.请运行并输入以下代码,得到什么结果 public class Test { public static void main(String[] args){ Foo obj1=new Foo(); ...

  7. PHP:JSON字符串转换为中文,中文转换为JSON字符串

    /** * 中文转换为JSON字符串 * @param $chinese_str 中文:可以包含中文字母数字 * @return string */ function json_encode($chi ...

  8. div+css制作带箭头提示框效果图(原创文章)

    一直都在看站友们的作品,今天也来给大家分享一个小的效果,第一次发还有点小紧张呢,语言表达能力不是很好,还请见谅…^ 先来个简单点的吧,上效果图 刚开始在网上看到效果图的时候感觉好神奇,当我试着写出来的 ...

  9. Codeforces Problem - 38E - Let's Go Rolling!(DP)

    E. Let's Go Rolling! time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  10. arm开发板6410/2440上mjpg-streamer网络视频服务器移植

    摄像头移植 一.环境 主机环境 :ubuntu 10.10         目标板 :FS-S5PC100 主机工具链 :gcc-4.4.5         交叉工具链 :arm-unknown-li ...