Hello,大家好!众所周知,C语言支持while、for、do...while三种循环方式,如果将循环嵌套起来,就可以解决很多问题。下面,我将根据我个人的研究学习,向大家分享一下如何用循环嵌套解决编程常见题目:找出100~200以内的素数。(素数又称质数,只能被1和本身整除的数字)
首先,我们要找出100~200之间的素数,那么外层循环就很容易确定。因为知道循环的范围(100~200),所以我优先考虑for循环。for(i=100;i<=200;i++)接下来就是内层循环了,根据素数的定义,我们就要用数字i去试除2~i-1之间的数字,知道这一点,那么内层循环就可以写出来了for(j=2;j<=i-1;j++)。
那么,两层循环确定下来了,如何判断是否为素数呢?我们可以定义一个标记flag,初始化为1。通过if来判断,如果数字i能整除2~i-1之间的数字,就让flag=0,一定要记得用break跳出内层循环,因为我们的目的是判断素数,一旦能整除一个数,就不可能是质数了,就不用再接着试除,提高代码效率。如果i是质数的话,flag的值不变,仍是初始化的值1。最后判断flag==1的话,就是质数,用printf打印出来就行。
下面分享一下代码(编程语言:C语言;编译环境:VS2022)
那么,肯定有小伙伴会质疑,这个算法的效率有点低下了。确实,我们可以在此基础上进行优化。根据素数的定义,我们知道,偶数绝对不可能是质数!!!(原因很简单,偶数一定能整除2)所以,我们可以将外层循环条件进行一下简单的修改,就可以极大地提高代码运行效率(因为要判断的数直接被砍掉了一半,只剩下了100~200之间的奇数),代码如下
(阴影区域就是改动部分):那还有没有什么办法能更好的提高效率呢?答案是有的,只不过要用到那么一丢丢数学思维。如果一个数m有因子a,b。即m=a*b。那么a和b中至少有一个数<=根号m。这个命题可以用反证法证明,假设a与b都大于根号m,那么a*b的值一定大于m,就与m=a*b产生矛盾了!知道这一点的话,那么内层循环也可以优化。将j的范围由<=i-1,修改为<=根号i。那么问题来了,根号i该如何用代码实现呢?别着急,C语言提供了一个库函数sqrt,专门解决开平方的问题,要注意的是,使用sqrt的时候,要记得先引入头文件<math.h>。如果不会使用该库函数,咱们写成j*j<=i也是没问题的。代码如下:
以上就是我对素数判断的全部理解,创作不易,还请大家多多点赞关注!大一小登,见解有限,欢迎大家指正!