目录
题目分析:
1.素数(质数):除了1与它本身之外没有其它约数,则为素数
2.打印100~200之间的素数,即要使目标数满足素数条件来筛选
解题思路:
1.先打印100~200之间的全部数
因为涉及很多数,所以采用循环语句,100~200,每个数都打印,则初始化为数字等于100,判断数字小于201,调整数字依次递增加一,满足for循环的结构,所以此处采用for循环来打印100`200之间的全部数字(如图所示)
2.通过素数条件,筛选符合条件的数字
素数的约数只有1与它本身,所以在1与它本身的数之间,没有其它数可以作为约数,即目标数除以此范围内的任何数的余数都不等于0
因为除数是在目标数与1之间任意数,所以才用循环语句打印出这之间所有数
因为要筛选所有不能除尽的数才满足条件,所以不能包含1与目标数本身,即初始化n=2,判断n<i,用if分支语句判断是否成立,成立则打印 (如图所示)
不过此处不能直接打印,下图为错误示范
因为要把每一个n都试除,但是此程序会逐步判断,也就是每一个n一直从2增加到i,只要不是i的约数,则打印i,即多次打印所有的i(如图所示)
3.正确方法:
我们已经知道此方法错误,即我们需要将每一个n都试除,若全都不满足余数为0,则打印目标数i,只要有一个满足余数为0则不是目标数,所以此处用flag变量来表示,若有相除余数为0的情况,则改变flag的值,若其值不变,则打印目标数i(如图所示)
代码实现:
易错点:
1.int n = 0;应该放在第一个for循环内,因为每一个i都要把n从2到i本身一一试除,所以每次i变化,n的值都需要重置
2.flag原因同上
算法优化:
1.我们已经知道,素数的约数只有1和它本身,那么自然数中有奇数与偶数,所以偶数的约数一定有2(不考虑0),则除了2之外的大于1的偶数,一定不是素数,由奇数加奇数为偶数,奇数加偶数为奇数的原则,可以把i初始化101,调整为依次加2,此方法减少一半运算(如图所示)
2.是否可以继续优化?可以
通过数学经验我们知道,任何一个数它都存在一个约数小于或等于它的平方根(不考虑1)
证明如下:
反证法:,假设原命题不成立,设一个数m的平方根为n,由假设得,一定有两个数a,b为m的约数,且a,b大于n,则a*b>m,假设不成立,所以原命题成立
通过代码实现,使用sqrt()表示一个数的平方根,注意需要头文件math.h(如图所示)
3.检验是否正确:
通过设置一个变量count,每打印一个目标数i,则count++,最终看看是否到达目标总数(如图所示)
今天就总结到此,感谢您的垂阅,敬请指教,谢谢。