C#计算素数序列浅谈

学习C#语言时,经常会遇到C#计算素数序列问题,这里将介绍C#计算素数序列问题的解决方法。

素数寻找问题由来已久,一直是一些数学家追求的目的。关于素数的定义及性质,我就不在这里多叙了,相信大家都对此了如指掌。素数的寻找思路比较的简单,根据素数的性质(素数应该不能被除了1和它自身的其他数整除)我们可以从最小的素数2开始,一直到比它小1的数为止,用这些数去整除它,如果它能被整除则它必定不是素数,这是判断单个素数的方法(这个算法思想最简单,时间复杂度***)。对于寻找比某一个给定的整数值小的所有素数也可以采用这种方法,不过我们会发现,采用这种单个判断的方法所耗的时间比较多。比如查找不大于10的素数,我们必须从2开始一个个判断,共需判断9个数,事实上按照我们后面讲述的方法,只需循环2次就可以了。因此,下面的两种方法都将基于删除法来做。

我们来看看删除法的思想:

1.将小于给定整数值n的所有正整数加到一个数组中;

2.删除能够被一些整数整除的数;

3.数组中遗留的元素就是***C#计算素数序列。

 
 
 
  1. class prime  
  2. {  
  3. public static int[] PrimeList;  
  4. publicstatic void FindPrime(int n)  
  5. {  
  6. int[] IntList;  
  7. IntList=new int[n];  
  8. for (int p=2;p<=n;p++) IntList[p-1]=p;  
  9. for (int p=2;p<Math.Sqrt(n);p++)  
  10. {  
  11. int j=p+1;  
  12. while (j<=n)  
  13. {  
  14. if ((IntList[j-1]!=0 ) && ((IntList[j-1]% p)==0) ) IntList[j-1]=0;  
  15. jj=j+1;  
  16. }  
  17. }  
  18. int i=0;  
  19. for (int p=2;p<=n;p++)  
  20. {  
  21. if (IntList[p-1]!=0) ii=i+1;  
  22. }  
  23. PrimeList=new int[i];  
  24. i=0;  
  25. for (int p=2;p<=n;p++)  
  26. {  
  27. if (IntList[p-1]!=0)  
  28. {  
  29. PrimeList[i]=IntList[p-1];  
  30. ii=i+1;  
  31. }  
  32. }  
  33. }  

这这个算法中,删除的数是那些被从2开始直到n的平方根的整数整除的数。这个算法比起前面介绍的单个素数的寻找方法要好,它的循环次数减少了一多半,但是这个算法还不是最理想的:

1.例如,6既能被2整除,也能被3整除,那么当p=2时,6被删掉了一次;当p=3时,6又被删除了一次,虽然按照我们设定的算法规则,这不会导致冲突(通过判断IntList数组元素是否为0,若为0就不必重复删除),但是这会使得算法的效率低下。

2.还有C#计算素数序列元素个数时,我们也走了弯路。***步,我们先计算出了数组元素大小,第二步才开始赋值,事实上这两步我们可以减去计算数组大小这一步,可以把它放在前面完成。

3.已经被删除了的元素,也就是那些不是素数的元素,可以不用拿他们去整除整数,例如4不用拿去整除8,因为能被4整除的数肯定能被2整除,已经在前面循环中被删除了。

基于上述考虑,我们得到了一个效率更加高的算法:

 
 
 
  1. class primegood  
  2. {  
  3. public static int[] PrimeList;  
  4. public static void FindPrime(int n)  
  5. {  
  6. int[] IntList;  
  7. int len=n-1;  
  8. IntList=new int[n];  
  9. for (int p=2;p<=n;p++) IntList[p-1]=p;  
  10. for (int p=2;p<Math.Sqrt(n);p++)  
  11. {  
  12. if (IntList[p-1]==0) continue;  
  13. int j=p*p;  
  14. while (j<=n)  
  15. {  
  16. if (IntList[j-1]!=0 )  
  17. {  
  18. IntList[j-1]=0;  
  19. lenlen=len-1;  
  20. }  
  21. jj=j+p;  
  22. }  
  23. }  
  24. PrimeList=new int[len];  
  25. int i=0;  
  26. for (int p=2;p<=n;p++)  
  27. {  
  28. if (IntList[p-1]!=0)  
  29. {  
  30. PrimeList[i]=IntList[p-1];  
  31. ii=i+1;  
  32. }  
  33. }  
  34. }  

【编辑推荐】

  1. 运用C#数据提供者
  2. C#允许运算符重载剖析
  3. Java和C#顶层声明概述
  4. C#完全限定名简单分析
  5. C#数据类型简单介绍
免责声明:文章内容不代表本站立场,仅供读者参考。产品相关技术问题请发送工单。 本文链接:https://www.idc.net/help/406883/

为您推荐

开源数据收集引擎 Logstash 讲解和示例讲解

一、概述 Logstash 是一个开源的数据收集和日志处理工具,它是 Elastic Stack(ELK Stack)的一部分,用于从各种数据源中采集、转换和传输数据,以帮助分析和可视化大规模数据。Logstash 通常与 Elasticsearch 和 Ki...

八个开源免费单点登录(SSO)系统

单点登录(SSO)是一个登录服务层,通过一次登录访问多个应用。使用SSO服务可以提高多系统使用的用户体验和安全性,用户不必记忆多个密码、不必多次登录浪费时间。 下面推荐一些市场上最好的开源SSO系统,可作为商业SSO替代。 1.Authelia https://github.com/authelia/authelia ...

浅谈HBase数据结构和系统架构

Part 01 LSM树模型 常见的的关系型数据库,如MySQL、SQL Server、Oracle等,使用B+ Tree作为数据存储与索引的基本结构,非叶子节点只存放索引数据,叶子节点存放所有数据和指向相邻节点的指针,具有高效的范围查询和稳定的查找效率,以及具有较小的读放大和空间放大。采用磁盘随机读写方式,且以磁盘数...

微软Radius平台重构现代应用程序部署

微软的 Azure 孵化团队日前推出一个叫 Radius 的新应用平台。Radius 平台可用于在 Kubernetes、公共云和边缘环境中运行各种现代应用程序。 Radius 是一个开源项目,最初支持的应用程序运行时包括Kubernetes、Azure和AWS,以后还会支持诸如谷歌云平台等云环境。 Mark Russ...

Ext JS3.0正式版发布

Ext JS3.0在经历数次RC版之后,extjs.com终于发布3.0的正式版。总体而言,较2.0改进不大,依然还是原理的组件模型,具体更新及改进如下: ◆提供了参照DWR后与后台的通讯包Direct,支持具有明显的REST风格的CRUD服务 ◆一系列的新的组件和例子,包括有图表(Charting, By YUI F...
返回顶部