第47讲 用筛法求素数.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第47讲 用筛法求素数

第47讲 用筛法求素数 类型 开拓思路题 趣味性 *** 难度 **** 前面已经介绍了用蛮力法(或称为穷举法)求出10万以内的所有素数的方法,但此方法花费的时间较多。那么,是否存在更为优越的算法来求出所有素数呢?这种方法是存在的。 素数(即质数)是大于1,并且除了1和它本身外,不能被其他任何数所整除的整数。 用筛法求素数是基于这样的想法。首先将整数2,3,4,5,6,…,99999,100000依次存放于某数组中的a[2],a[3],a[4],…,7步) (7)如果a[i]不为0 /*说明此数是素数,因为没被筛掉*/ 那么,跳转到第3步; 否则,跳转到第5步 /*此数已被筛掉了*/ (8)结束 此算法理解起来并不太难,也可以直接用if加无条件跳转语句来实现。 代码如下: #includestdio.h int main() { int a[100001],i,j; /*将0万个数放到a数组中,a[1]中存放1,a[2]中存放2……a[99999]中存放99999,a[100000]中存放100000*/ for(i=0;i=100000;i++) {a[i]= i; } i=2; loop1:printf(“%d ”,a[i]); /*将所有下标值为i的倍数的数组元素的值变为0,即a[i*j]=0*/ for(j=1; i*j=100000;j++) { a[i*j]=0; } /*将i的值加1,如果i100000,则跳转到第7步*/ loop2:i++; if(i100000) goto loop3; /*判断此时a[i]是否为0,如果不为0(说明此数是素数),则跳转到第3步,否则,(此数不是素数,它一定是前面某个i的倍数而且已经被筛掉即清0了),跳转到第5步。*/ if (a[i]!=0) goto loop1; else goto loop2; loop3: ; } 点评此程序可以求出10万以内的所有素数,所花费的时间确实比以前少了很多。但此题的算法中用了三条(无条件跳转)goto语句,程序的流程结构看起来比较复杂混乱,这违反了结构化程序设计思想。结构化程序设计思想不提倡用goto语句,更不提倡大量使用goto语句。不过,由于人们在考虑算法时,跳转语句更贴近人们的自然思路,如果实在没有别的办法想出不用跳转语句构成的循环结构,则上述的算法和程序也不失为一种临时应急的解决办法。这也是本书为何要讨论循环语句与跳转语句关系的根本原因所在。 那么,是否能把此题改为不用goto语句的循环呢?先将上述算法复制于此,便于讨论。 (1)先把10万个数放到a数组中,a[1]中存放1,a[2]中存放2……a[99999]中存放99999,a[100000]中存放100000 (2)设置一个变量i,初值为2 (3)将a[i]打出来(此数一定是素数) (4)将所有下标值为i的倍数的数组元素的值变为0,即a[i*j]=0 即将其筛掉 (5)将i的值加1 (6)如果i100000,则跳转到第8步 (否则将顺序执行第7步) (7)如果a[i]不为0 /*说明此数是素数,因为没被筛掉*/ 那么,跳转到第3步; 否则,跳转到第5步 /*此数已被筛掉了*/ (8)结束 仔细分析上述算法,可以将其改为如下算法:将原算法中的第7步的if语句,提前到第2步的后面;这样,条件为“真”时执行原来的第3步和第4步,将其组成复合语句(即现在的(3.1)和(3.2)步);条件为“假”本来要跳转到原来的第5步去执行,现在可以直接将这一步变为if语句 else 后面的分句。原来的第6步现在被改为第4步了。 注意 if语句本身一般不会改变变量的取值(只要布尔表达式本身是没有副作用的) (1)先把10万个数放到a数组中,a[1]中存放1,a[2]中存放2……a[99999]中存放99999,a[100000]中存放100000, (2)设置一个变量i,初值为2 (3)if(a[i]不为0 )/*说明此数是素数,因为没被筛掉*/ { (3.1)将a[i]打出来 /*此数一定是素数*/ /*将下标值为其任何倍数的数组元素,从数组中筛掉,即将其值变为0*/ (3.2)将所有下标值为i的倍数的数组元素的值变为0,即a[i*j]=0 } else 将i的值加1; /*a[i]==0,说明此数已经被筛掉了*/ (4)if ( i100000) 跳转到第5步; else 跳转到第3步; (5)结束 第二步改进:此算法还可以继续改进,原来是i100000则跳到结束处,否则继续执行“如果a[i]不为0”的判断。现在将条件i100000改为i=100

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档