- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 《解析几何》教案--吕林根,许子道.pdf
- 美国加州桥梁抗震caltrans seismic design criteria vlysis.pdf VIP
- 2025云南省临沧市市级单位公开遴选(选调)工作71人笔试参考题库附答案解析.docx VIP
- HSE保障措施优化及实施方案研究.docx VIP
- 2025甘肃省公路交通建设集团武仙公路收费运营人员招聘61人笔试模拟试题及答案解析.docx VIP
- 2025年秋新鲁科版英语四年级上册全册课件.pptx
- 颚式破碎机技术参数.docx VIP
- 2024河南资本集团“方舟”第三批招聘41人笔试参考题库附带答案详解.pdf
- 《时尚配饰设计》课件.ppt VIP
- 高边坡专家论证PPT汇报材料(中建).ppt VIP
文档评论(0)