用"埃拉托色尼筛"求质数

原创 2007年09月19日 20:37:00

       该算法一开始初始化一个2~n的连续整数序列,作为候选质数.然后,在算法的第一个循环中,它将类似4和6这

样的2的倍数从序列中消去.然后,它指向列表中的下一数字-3,对将其倍数消去.该算法以这个方式不断做下

去,直到序列中已经没有可消的元素为止.
          需要注意的是,如果当前步骤中,我们正在消去p的倍数,那么第一个值得考虑的倍数是p*p,因为其他更小的倍

数2p,……,(p-1)*p已经在先前的步骤中从序列里消去了.了解这个事实可以帮助我们避免多次消去相同的数

字.显然,p*p不会大于n,p也不会大于根号n向下取整的值.

算法:
int Sieve(int a[],int n)   //返回2~n中质数的个数,质数存放在数组a中
{  //实现"埃拉托色尼的筛子"
 int p,i,j;
 for(p=2;p<=n;p++)
  a[p]=p;
 for(p=2;p<=sqrt(n);p++)
 {
  if(a[p])      //没有被前面的步骤消去
  {
   j=p*p;
   while(j<=n)
   {
    a[j]=0;   //将该元素标记为已经消去
    j+=p;
   }
  }
 }
 i=0;
 for(p=2;p<=n;p++)
 {
  if(a[p])
  {
   a[i]=a[p];
   i++;
  }
 }
 return i;
}

相关文章推荐

找质数算法之埃拉托色尼筛选法(Sieve of Eratosthenes算法)

一、算法原理 一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。 二、步骤 (1)先把1删除(1既不是质数也不是合数) (2)...

(素数)埃拉托色尼筛

  • 2013年08月04日 11:39
  • 460B
  • 下载

埃拉托色尼筛子

埃拉托色尼筛子 在中学时代我们曾经使用著名的欧几里得算法来求两个整数的最大公约数。用现代数学的术语来表述,欧几里得算法基于的方法是重复应用下列等式,直到m  mod n等于0:     gcd(m...

埃拉托色尼示例代码

  • 2012年11月18日 16:18
  • 5KB
  • 下载

程序3.5 埃拉托色尼筛法

筛法思想:从素数的定义出发(除了1和本身之外不能被其他数整除的数,包括 0,1),根据这个定义,可以筛除序列2的倍数(2 4 6 8 10。。。),3的倍数(3 6 9 12.。。。)。。。。知道序列...

使用埃拉托色尼筛选法(Eratosthenes)得到素数

什么是埃拉托色尼筛选法(Eratosthenes) ? 解答:要用这种方法确定素数,就要列出所有小于等于N(大于1)的整数,然后除去所有小于等于N的平方根的素数的所有倍数。 例如...

辗转相除法、埃拉托色尼筛选法、牛顿迭代法证明与C++实现

1.辗转相除法 辗转相除法是用来计算两个数最大公约数的。 对于m,n求最大公约数,公式为: gcd(m,n) = gcd(n, m mod n) 证明:    //最大公约数用e表示。 对于m=n时,...

质数筛选方法(埃拉托斯特尼筛法)

今天刷题刷了这么一道题, The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes...

艾托色尼法验证素数

  • 2012年03月19日 18:33
  • 1.49MB
  • 下载

实现“挨拉托色尼的筛子”

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用"埃拉托色尼筛"求质数
举报原因:
原因补充:

(最多只允许输入30个字)