题目如下:
找出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