`
qiemengdao
  • 浏览: 276478 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

素数算法

 
阅读更多

题目:

写一个程序,找出前N个素数。比如N为100,则找出前100个素数。

分析

最基本的想法就是对1到N得每个数进行判断,如果是素数则输出。一种改进的方法是不需要对1到N所有的数都进行判断,因为偶数肯定不是素数,而奇数可能是素数,可能不是。2,3,5都是素数,这可以直接得到。然后我们可以跳过2与3的倍数,即对于6n,6n+1, 6n+2, 6n+3, 6n+4, 6n+5,我们只需要判断6n+1与6n+5是否是素数即可。

判断某个数m是否是素数,最基本的方法就是对2到m-1之间的数整除m,如果有一个数能够整除m,则m就不是素数。判断m是否是素数还可以进一步改进,不需要对2到m-1之间的数全部整除m,只需要对2到根号m之间的数整除m就可以。如用2,3,4,5...根号m整除m。其实这还是有浪费,因为如果2不能整除,则2的倍数也不能整除,同理3不能整除则3的倍数也不能整除,因此可以只用2到根号m之间小于根号m的素数去除即可。


解法1:基本解法

给出一个最基本的解法就是预先可得2,3,5为素数,然后跳过2与3的倍数,从7开始,然后判断11,然后判断13,再是17...规律就是从5加2,然后加4,然后加2,然后再加4。如此反复即可,如下图所示,只需要判断7,11,13,17,19,23,25,29...这些数字。对这些数进行判断,如果是素数则输出。

判断是否是素数采用改进后的方案,即对2到根号m之间的数整除m来进行判断。需要注意一点,不能直接用根号m判断,因为对于某些数字,比如121,开根号后得到的不一定是11,可能是10.999999,所以最好使用乘法判断,如代码中所示:



#include  <stdio.h>

#define   MAXSIZE    100
#define   YES          1
#define   NO           0

int main(void)
{
     int  prime[MAXSIZE];     /* array to contains primes */
     int  gap = 2;            /* increasing gap = 2 and 4 */
     int  count = 3;          /* no. of primes            */
     int  may_be_prime = 5;   /* working  variable        */
     int  i, is_prime;

     prime[0] = 2;            /* Note that 2, 3 and 5 are */
     prime[1] = 3;            /* primes.                  */
     prime[2] = 5;
     while (count < MAXSIZE)  { /* loop until prime[] full*/
          may_be_prime += gap;  /* get next number        */
          gap           = 6 - gap; /* switch to next gap  */
          is_prime      = YES;  /* suppose it were a prime*/
          for (i = 2; prime[i]*prime[i] <= may_be_prime && is_prime; i++)
               if (may_be_prime % prime[i] == 0) /* NO    */
                    is_prime = NO; /* exit                */
          if (is_prime)       /* if it IS a prime...      */
               prime[count++] = may_be_prime;  /* save it */
     }

     printf("\nPrime Number Generation Program");
     printf("\n===============================\n");
     printf("\nFirst %d Prime Numbers are :\n", count);
     for (i = 0; i < count; i++) {
          if (i % 10 == 0) printf("\n");
          printf("%5d", prime[i]);
     }
     return 0;
}


解法2:筛选法

用一个数组x[]存储3,5,7...这些奇数,则x[i]存的就是2i+3,这样初始设置所有数都没有筛掉,然后逐次把合数筛掉。实际就是把2i+3的倍数筛掉,2i+3的倍数可以写成(2i+3)j,j>1,不然j=1会筛掉自己。又由于偶数不用考虑,所以筛掉的数应该为(2n+1)(2i+3)=2[n(2i+3)+i]+3。因此要筛掉的数在数组中的位置为n(2i+3)+i,n=1,2,3...n=1时,这个值就是2i+3+i,n=2时为2(2i+3)+i;如果一共有N个元素,则x[]中最后一个元素x[N-1]=2N+3,由此就可以得到2到2N+3之间所有素数。代码如下,注意下面的代码并不是求前200个素数,而是求的从2到403之间的素数。
/* ------------------------------------------------------ */
/* FUNCTION sieve :                                       */
/*    This program uses Eratosthenes Sieve method to      */
/* generate all primes between 2 and MAXSIZE*2+3.  This   */
/* is a very simple yet elegant method to generate primes */
/*                                                        */
/* Copyright Ching-Kuang Shene               July/01/1989 */
/* ------------------------------------------------------ */

#include  <stdio.h>

#define   MAXSIZE   200
#define   DELETED     1
#define   KEPT        0

void main(void)
{
     int  sieve[MAXSIZE+1];   /* the sieve array          */
     int  count = 1;          /* no. of primes counter    */
     int  prime;              /* a generated prime        */
     int  i, k;               /* working variable         */

     printf("\nEratosthenes Sieve Method");
     printf("\n=========================");
     printf("\n\nPrime Numbers between 2 and %d\n", MAXSIZE*2+3);

     for (i = 0; i <= MAXSIZE; i++) /* set all items to be*/
          sieve[i] = KEPT;    /* kept in the sieve        */

     for (i = 0; i <= MAXSIZE; i++) /* for each i, it     */
          if (sieve[i] == KEPT) {   /* corresponds to 2i+3*/
               prime = i + i + 3;   /* if it is not sieved*/
               count++;             /* prime=2i+3.        */
               for (k = prime + i; k <= MAXSIZE; k += prime)
                    sieve[k] = DELETED; /* screen multiple*/
          }

     printf("\n%6d", 2);      /* output part.             */
     for (i = 0, k = 2; i <= MAXSIZE; i++)
          if (sieve[i] == KEPT) {
               if (k > 10) {
                    printf("\n");
                    k = 1;
               }
               printf("%6d", 2*i+3);
               k++;
          }
     printf("\n\nThere are %d primes in total.", count);
}



分享到:
评论

相关推荐

    最快素数算法(绝非线性筛选)1.6秒算出1亿内所有素数

    革命性素数算法:计算1亿内素数只要1.6秒 算法基本跟之前发的C#版相同(http://download.csdn.net/source/690005内有算法描述),由我的朋友杨力2年前设计,时间复杂O(n)。我对其进行了革命性的数据结构改进,空间...

    简易素数算法导出的经典素数算法

    因此,本文将详细探讨从简易到复杂的素数检测算法,帮助读者深入理解这些算法的原理和应用。 首先,我们从最基本的素数检测方法讲起。基础判断法是一种非常直观的方法,它通过遍历从2到n-1的所有整数来判断一个数n...

    素数算法素数代码

    根据提供的文件内容,我们可以归纳出以下几个关键的知识点: ...以上内容综合了基础素数生成算法、命令行脚本实现、以及概率性素数测试算法的关键知识,希望能帮助理解素数算法的核心原理及其实际应用。

    相邻素数算法详细pdf文档

    ### 相邻素数算法详解 #### 一、引言 在算法设计与分析的课程中,有一种较为重要的算法——相邻素数算法。本篇文章将详细介绍该算法的基本概念、实现原理以及具体的步骤演示,帮助读者深入理解并掌握这一算法。 #...

    大范围素数算法

    大范围的素数算法,解决素数算法的问题,当程序需要,为什么非得20个字的描述呢

    生成大素数算法,速度很快,包括大数运算

    大素数的生成算法通常用于建立加密系统,如RSA公钥加密算法,其中需要找到两个非常大的质数来生成密钥对。速度很快的大素数生成算法对于提高系统的效率至关重要。 1. **大素数生成算法**: - **米勒-拉宾素性检验...

    Java中素数算法非常实用

    ### Java中的素数算法 #### 一、引言 在计算机科学领域,特别是算法与数据结构的研究中,素数检测是一项基本且重要的任务。本文将详细介绍一个简单的Java程序,该程序能够有效地找出并打印出前500个素数。 #### ...

    C语言教学中关于素数算法的应用与分析.pdf

    素数算法是计算机编程教学中的一个重要部分,尤其是在C语言的范畴内。素数本身是只能被1和它本身整除的自然数,例如2、3、5、7等。在C语言教学中,掌握素数算法不仅仅是学习素数的定义,更关键的是学会如何应用这些...

    高职院校C语言教学中的素数算法.pdf

    在高职院校C语言的教学中,素数算法是基础编程教学的一个重要部分,它不仅涉及到计算机编程的基本逻辑思维,而且也与数学知识相结合。素数(又称质数)在编程中通常作为算法测试的案例出现,在很多编程基础的课程...

    以模6为基本的素数算法

    标题中的“以模6为基本的素数算法”是指一种基于数学原理的筛选素数的方法。在数论中,素数是大于1且只能被1和自身整除的正整数。这种算法可能是利用了模6余数的性质来简化素数筛选过程。 描述中提到该算法在...

    C# 求某个正整数的素数算法应用程序

    在"求素数的个数"这个文件中,可能包含了实现这个功能的C#代码源文件,我们可以深入研究其具体实现细节,例如如何处理输入验证、优化算法效率等。学习并理解这段代码有助于提升C#编程技能,尤其是对于数值计算和用户...

    经典算法2(素数算法).c

    经典算法2(素数算法).c

    python 求素数算法 可以限定运行次数

    完整的 python 求素数算法 可以限定运行次数 可以中断保存

    素数算法_ 循序渐进

    ### 素数算法详解 #### 一、素数的基本概念与定义 - **定义**:素数(Prime Number)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 - **示例**:最小的几个素数包括2、3、5、7等。 #### 二、...

    O(n)级素数算法,非常快,1千万只要1.5秒

    O(n)级的素数算法,我的朋友,杨力2年前设计,感谢他如此简洁美妙的算法。 虽然有多次遍历,但严格证明可得,算法效率为一个O(n),1千万只要1.5秒。算法依赖于内存大小,不要创建超过内存大小的数组,否则效率下降很...

    miller-robin素数算法

    **米勒-拉宾素数测试算法** 在数学和计算机科学中,判断一个大整数是否为素数是一项基础但重要的任务。米勒-拉宾素数测试算法(MILLER-RABIN Primality Test)是一种概率性算法,用于检测一个正整数是否可能为素数...

    素数算法报告

    ### 素数算法报告知识点概述 #### 一、素数定义及意义 素数,又称质数,指的是只能被1和自身整除的大于1的自然数。素数不仅在数学理论中占有极其重要的地位,而且在现代密码学、网络安全等领域发挥着核心作用。...

    visual basic 素数经典算法vb6.0 vb.net关于素数的算法

    以下我们将详细探讨素数的概念、经典的素数算法以及如何用VB实现这些算法。 素数概念: 素数定义为大于1的自然数,除了1和它本身以外没有其他正因数。例如,2、3、5、7、11、13等都是素数,而4、6、8、9等则不是,...

    逐步修改素数高效算法

    在编程和计算机科学领域,素数高效算法是一个关键的研究方向,尤其对于数学、密码学以及高性能计算等应用。本文将详细探讨"逐步修改素数高效算法",旨在为读者提供深入的理解和参考。 首先,素数是大于1且只有1和其...

Global site tag (gtag.js) - Google Analytics