素数筛的方法 筛出小于n的所有素数

转载 2013年12月05日 14:30:46

    判断一个数字是否为素数,正如大家都知道的那样,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n)--n的开方,那么我们可以用这个性质用最直观的方法

来求出小于等于n的所有的素数。

    num = 0;

    for(i=2; i<=n; i++)

    {  for(j=2; j<=sqrt(i); j++)

         if( j%i==0 ) break;

       if( j>sqrt(i) ) prime[num++] = i;  //这个prime[]是int型,跟下面讲的不同。

    }

    这就是最一般的求解n以内素数的算法。复杂度是o(n*sqrt(n)),如果n很小的话,这种算法(其实这是不是算法我都怀疑,没有水平。当然没接触过程序竞赛之前我也只会这一种求n以内素数的方法。-_-~)不会耗时很多.

    但是当n很大的时候,比如n=10000000时,n*sqrt(n)>30000000000,数量级相当大。在一般的机子它不是一秒钟跑不出结果,它是好几分钟都跑不出结果,这可不是我瞎掰的,想锻炼耐心的同学不妨试一试~

    在程序设计竞赛中就必须要设计出一种更好的算法要求能在几秒钟甚至一秒钟之内找出n以内的所有素数。于是就有了素数筛法。

    (我表达得不清楚的话不要骂我,见到我的时候扁我一顿我不说一句话。。。)

    素数筛法是这样的:

    1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false.

    2.然后:

      for( i=3; i<=sqrt(n); i+=2 )

      {   if(prime[i])

          for( j=i+i; j<=n; j+=i ) prime[j]=false;

      }

    3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。

    原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质

数的倍数筛掉。

    一个简单的筛素数的过程:n=30。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

    第 1 步过后2 4 ... 28 30这15个单元被标成false,其余为true。

    第 2 步开始:

     i=3;  由于prime[3]=true, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]标为false.

     i=4;  由于prime[4]=false,不在继续筛法步骤。

     i=5;  由于prime[5]=true, 把prime[10],[15],[20],[25],[30]标为false.

     i=6>sqrt(30)算法结束。

    第 3 步把prime[]值为true的下标输出来:

     for(i=2; i<=30; i++)

     if(prime[i]) printf("%d ",i);

    结果是 2 3 5 7 11 13 17 19 23 29

小于等于n的素数的个数(埃式筛选法和欧拉筛选)

问题描述给定数字n,求出小于等于n的素数的个数,假设n
  • BeforeEasy
  • BeforeEasy
  • 2017年08月15日 17:32
  • 545

c语言:实现对于给定的正整数N,依次打印出小于等于N的所有素数。两种方法及其优化

请编写一个程序,实现对于给定的正整数N,依次打印出小于等于N的所有素数。方法一:试除法由素数的定义得到如下程序:#includeint print_prime(int num)//prime表示素数{...
  • yanxiaolx
  • yanxiaolx
  • 2016年05月29日 13:38
  • 3558

Eratosthenes筛选法求小于N的所有素数个数

Eratosthenes筛选法求小于N的所有素数个数
  • zhangxiao93
  • zhangxiao93
  • 2017年02月09日 00:05
  • 434

大数区间筛素数 线性

const int N=1000010; int prime[N], np; bool vis[N]; void get_prime(int l,int r) { np = 0; me...
  • ehi11
  • ehi11
  • 2012年08月21日 20:27
  • 931

算法之素数筛法

方法一 //判断是否是一个素数 int IsPrime(int a){ //0,1,负数都是非素数 if(a ...
  • SJF0115
  • SJF0115
  • 2013年03月20日 09:08
  • 7997

获取小于N的素数 优化筛选法的C++实现

孪生素数(间隔为2的相邻素数)的相关定理与推论P1: 当 N 不小于 6 且 N-1 和 N+1 为 孪生素数, 则 N 一定是 6的倍数T1:当 N 不小于 1 且 N=6x-1 或 N=6x+1 ...
  • liudglink
  • liudglink
  • 2015年04月10日 02:18
  • 958

蓝桥杯—用筛法求N内的素数

蓝桥杯—用筛法求N内的素数
  • qq_37236745
  • qq_37236745
  • 2017年12月05日 12:20
  • 152

筛素数解法

常用的筛素数的算有两种: 1). Eratosthenes筛法:把[1,N]素数p的倍数筛出去,剩余的就是素数。 int prime[N], np; bool vis[N]; void get...
  • niuox
  • niuox
  • 2013年02月18日 16:26
  • 1465

用筛法求N之内的素数

Problem A: 用筛法求N之内的素数。 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 537  Solved: 242 [Submit...
  • u013629228
  • u013629228
  • 2014年03月06日 12:52
  • 2803

求小于n的所有素数,按照每行10个显示出来

内容:求小于n的所有素数,按照每行10个显示出来 目的:掌握for循环及怎样判断一个数是否为素数 程序代码: /* * 程序的版权和版本声明部分: * Copyright (c) 2013,...
  • kuangxiaoguo0123
  • kuangxiaoguo0123
  • 2013年03月24日 14:28
  • 2341
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:素数筛的方法 筛出小于n的所有素数
举报原因:
原因补充:

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