既然是“打印100~200 之间的素数 ”,必然涉及两点:
(1)100-200之间的所有数字有哪些
(2)对于给出的一个数字,如何判断是素数
所以此题我们把它拆解成以上两部分考虑,这也是为之后代码优化提供思路的切入点
方法一:最常规
对于第(1)点:依次遍历100-200之间的数字
对于第(2)点:按照“素数定义”判断,依次检验除了1和它本身的所有数字,看能否被整除,如果能,则说明不是素数;如果不能,则是素数。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int main()
{
int num = 0;
for (num = 100; num <= 200; num++)
{
int isprime = true;//默认是素数
for (int i = 2; i < num; i++)
{
if (num%i == 0)
{
isprime = false;//不是素数
break;
}
}
//因为出循环只有两种情况:(1)能被2-自身以内的某个数整除,break跳出(2)不符合i<num的条件,跳出
//所以这里必须根据标志位isprime的值进行判断是否是素数,若是素数则输出
if (isprime == true)
{
printf("%d ", num);
}
}
system("pause");
return 0;
}
接下来我们思考有没有更优的解决方案:
首先,偶数肯定不是素数,所以对于第(1)点,首先100-200之间的数字就可以去掉偶数,只遍历检查奇数。
其次,对于第(2)点,不需要依次检验2—num本身之间的所有数字,检测的因子只需要到num的平方根即可。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
int main()
{
int num = 0;
for (num = 101; num <= 200; num += 2)//只检查奇数
{
int isprime = true;
for (int i = 2; i <= sqrt(num); i++)//除数只检查到sqrt(num)
{
if (num%i == 0)
{
isprime = false;
break;
}
}
//判断
if (isprime == true)
{
printf("%d ", num);
}
}
system("pause");
return 0;
}
结果: