在解决一个判断100-200间素数的问题是,首先想到的是利用素数的特性(因数只有1和他本身),首先想到的是i定义a,b两个数利用两层for循环,第一层循环遍历100-200间的数,
第二层循环看是否能够用a整除,若能整除则该数不是素数,否则是素数,刚开始的代码是这样的
include"stdio.h"
#void main()
{
int a = 0;
for (int a = 100; a <= 200; a++)
{
int b = 0;
for (int b =2 ; b <a; b++)
{
if (a%b == 0)
{
printf_s("不是素数\n");
}
else
printf_s("%d是素数\n", a);
}
}
getchar();
}
自信满满,这题太简单了,而现实往往是打脸的
一个数输出好多遍,结果也不正确,苦思冥想,肯定是算法出了问题,
{
if (a%b == 0)
{
printf_s("不是素数\n");
}
else
printf_s("%d是素数\n", a);
}
在这个地方,例如105,肯定不会被2整除,会跳到else直接输出105是素数,显然105不是素数。
循环出了问题,怎么解决呢?肯定要想一个办法,使b能循环到小于a的地方且要使b中的数都能被a除一遍,好,思路来了,改良代码
将此片段改为
for (int b =2 ; b <a; b++)
{
if (a%b == 0) break;
if(b+1==a)
printf_s("%d\n", a);
}
第一个if保证如果a能被b整除的就跳出,进行b++来判断下一个b能否满足条件,第二个if控制b能遍历从2到a所有的数,如果不满足第一个条件,且满足第二个条件的话,就会
输出a,即为素数。
两个完美的循环,代码的之美就在于此。
奉上完整的代码。
#include"stdio.h"
void main()
{
int a = 0;
for (int a = 100; a <= 200; a++)
{
int b = 0;
for (int b =2 ; b <a; b++)//从2开始循环,直到小于a
{
if (a%b == 0) break;
if(b+1==a) //防止像105/2不能整除就输出a的情况
printf_s("%d\n", a);//不满足第一个,且满足第二个就会输出a
}
}
getchar();//防止闪退
}
谢谢观看小菜鸟的程序