回顾
还记得素数判断吗?这里面有一个问题,我们只能判断素数,但是无法在一个范围内找出所有素数。今天我们就来借助相关例题讲解一下双层循环实现素数找出。
例题
本关任务:输入正整数 n,输出 n 以内的全部素数,并输出 n 以内所有素数个数。
分析
首先我们需要一个循环,遍历从2(1和小于一的直接排除)到n的所有整数,紧接着又需要素数判断的循环,这里就可以把上次的函数稍作修改拿来用,但是判断素数的函数括号里的量是一个变化的量,是遍历的量。
还是依旧可以标点法,但是标点法对flag在第一层循环要有重置的过程,否则当一个数不是素数,flag=0,然后就一直为0,遍历到下一个数尽管可能是素数,但因为flag没有重置为1,会导致也不输出(不会判定该数为素数)。(也是非常容易出bug的一点,真的很容易忘掉这个细节)
答案
#include<stdio.h>
int main()
{
int m,i,n=0,num=0;
int flag=1;
scanf("%d",&n);
for(m=2;m<=n;m++)
{
flag=1;//一定要在循环中重置flag=1,否则flag为0后素数也被输出为不是素数而筛掉
for(i=2;i<m;i++)//<m与<=m-1等价
{
if(m%i==0)
{
flag=0;
break;
}
}
if(flag==1)
{
printf("%d ",m);//打印出该素数
num++;
}
}
printf("\n%d以内共有%d个素数\n",n,num);
return 0;
}
方法总结
看到一个比较复杂的题,要学会分解拆分任务,这道题就是,首先我们要遍历2到n的数,其次是对每一个遍历到的数找素数处理,就还可以使用上次的方法,不过判断的数是个变化的,是在一个遍历循环里面的,因此出现双层循环,肯定是拆分任务。(拆分任务也是未来搞复杂工程的基本能力)
以上均是本人自己的理解,有什么不对的欢迎各位大佬指出~
标签:遍历,语言,判断,int,flag,素数,循环,升级版 From: https://blog.csdn.net/dyudbegdu/article/details/144477510