嵌套循环练习—找区间内素数的算法三阶优化

题目如下:
找出100~200之间的素数,并打印在屏幕上。注:素数⼜称质数,只能被1和本⾝整除的数字。

分析题目:
1.在100~200之间多次找数,考虑要用循环
2.由素数定义,可以用余数是否是0来判断,此时试除的数很多,用循环

阶1:练练嵌套循环

在这里插入图片描述
第一个for循环:先让a从100到200走起来
变量b:用来试除a,借助余数来判断
第二个for循环:让b从初始值2开始每个循环加一,在2~a-1范围内一次次试除a
第一个嵌套的if语句:判断余数,如果是0,那么break跳出循环,再进第一个for循环,此时a的值加一
第二个if语句:当b的值不满足b<a-1且每次循环中都没有余数是零的情况,便执行第二个if语句,然后打印出此时a的值

现在,通过笔者的几个错误来深入理解一些细节:

bug 1:

在这里插入图片描述
我直接在第二个for循环语句中嵌套了else
那么,如果a是素数,a%b必然有a-1个余数不是零,所以a会被打印a-1次
呜呜%d后面还忘加换行 看看难看的运行结果。。。。
在这里插入图片描述

bug 2:

在这里插入图片描述
看出来了吗?
问题在第二个for循环的判断条件:b<a
如果a=101,那当b=100时,满足b<a,此时b++后b变成了101,那到了if语句中,a%b余数是0,就会break跳出程序,什么都打不出来

运行结果是空白
所以再来粘一遍正确的程序
在这里插入图片描述
从bug中的总结:
1.跳出for循环的条件是:a.遇到break b.已经循环到不满足for循环的判断条件
便会跳出for循环的大括号,跳到下一层大括号包含的程序中,也就是为什么a的循环要把b的循环嵌套起来
2.要考虑清b的终止是什么,b<a-1才能让b的终值是a-1,如果是b<=a-1,那终值是a,运行结果也将是一片空白

阶2:

100~200中,偶数一定不是素数,所以可以直接从奇数中筛素数
来看
在这里插入图片描述
a从101开始,循环+2
在这里插入图片描述
成功

阶3:平方根筛

如果一个数a,从2<=b<=a的平方根 都不能找到b来整除a,那么a就是素数
这里,开根号需要使用sqrt这个库函数,sqrt包含在<math.h>头文件中
加上 #include<math.h>

在这里插入图片描述
这里,程序得到优化
当然,这些都是为了练习嵌套循环而写的
大牛级优化筛素数问题
请看这里
https://oi-wiki.org/math/number-theory/sieve/#%E7%BA%BF%E6%80%A7%E7%AD%9B%E6%B3%95

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值