本帖最后由 jackz007 于 2023-11-24 11:47 编辑
1、根据素数的定义,判断素数适合采用排除法,即,先假定目标数是一个素数,然后,循环枚举目标数所有可能的因子,逐一验证这些因子,如果其中有任何一个被落实,那就否定先前的假设,说明目标数不是素数;相反,如果这些因子无一被落实,那么,先前的假设成立,说明目标数的确是一个素数;
2、在实际操作中,设定一个标志数 flag,开始判断前,先让 flag = 1,代表目标数 num 是一个素数,然后,利用循环,在 [2 , num / 2] 的范围内,枚举 num 所有可能的因子,如果找到,那就让 flag = 0,最后,根据 flag 的值,即可判定 num 是否是一个素数;
3、至于循环枚举因子的数值范围,本来应该是 [2 , num - 1],之所以用的是 [2 , num / 2],那是为了减少可能因子的数量,从而减少无意义的循环次数,楼主应该懂得乘法交换律的道理,7 x 13 和 13 x 7 结果是一样的,都是 91,就是说,91 既能被 7 整除,也能被 13 整除,所以,在 [2 , 90] 的范围内,判断了 7 之后,就不需要再判断 13 了,如果按本例的代码,当 num 为 91 时,枚举的范围是 [2 , 45],在枚举了 7 之后,仍然会枚举 13(因为 2 < 13 < 45),并没有起到避免无意义循环的目的,所以,正确的枚举区间应该是 [2 , sqrt(num)],也就是 [2 , 10],这样,就可以彻底避免无意义的循环。
所以,最终的代码应该修改为:#include <stdio.h>
#include <math.h>
int main()
{
int i , num flag = 1 ; // DEV C++ 不支持布尔型变量,那就把 flag 定义为整形数就可以
printf("请输入一个整数") ;
scanf("%d" , & num) ;
for(i = 2 ; i <= sqrt(num) , i ++)
{
if(num % i == 0)
{
flag = 0 ;
}
}
if(flag)
{
printf("%d是一个素数\n" , num) ;
}
else
{
printf("%d不是一个素数\n" , num) ;
}
return 0 ;
}
|