什么是质数?
质数就是只能被1和他自己整除的数字
怎么实现这个程序?
使用for循环求出范围内所有数字,嵌套一个for循环求出1到范围内某个数字的平方根的所有数字,再通过求模运算来判断是否能整除,从而来判断是否为质数。
为什么是平方根呢?
-
第一次代码优化
一个数字的因数里,除了1和自己以外最大的因数一定小于等于自身的一半,换句话讲,一个数字不可能被大于自身一半的数字整除。
2 | 18 | 2 | 16 |
3 | 12 | 4 | 8 |
4 | 9 | 8 | 4 |
6 | 6 | 16 | 2 |
9 | 4 | ||
12 | 3 | ||
18 | 2 |
-
第二次代码优化
有了上一次的优化后我们可以尝试列出几个数字的所有因数,例如上图的36和32。不难发现,36的平方根之后的因数9,12,18所对应的4,3,2重复出现了两次,所以没有意义。32的平方根约等于5.66,介于4和8之间,平方根之后的因数也是重复的。所以我们可以得出结论:除重复的因数外,一个数的最大的因数小于等于该数的平方根。
此方法的核心就在于内层for循环是如何结束的,其一:不符合内层循环的判断条件,循环结束;其二:在内层循环的循环体中break提前结束。
代码如下:
#include <stdio.h>
#include <math.h>
int main()
{ //定义count为计数器,后面会用它来记录打印次数
int count = 0;
//外层循环求出100-500的所有数字
for(int i = 100; i <= 500; i++){
int j;
//内层循环求出2到该数字i的平方根
for(j = 2; j <= sqrt(i); j++){
//判断:数字i能否被j整除
if(i % j == 0)
//如未整除,则继续执行内层循环的表达式“j++”
//如果整除,则i为合数,提前结束内层循环,执行外层循环
break;
}
//根据for循环的执行顺序:表达式1->表达式2->循环体->表达式3
//循环体中if语句的判断结果若始终为假,将再次返回到表达式3
//执行内层循环的表达式“j++”后,该循环的判断条件为假,内层循环结束
//判断:j是否大于数字i的平方根
if(j > sqrt(i)){
//如果条件成立,打印该数字并格式化打印语句
printf("%4d ",i);
//打印一次,计数器自增1
count++;
//判断:当计数器是10的倍数,打印一个回车符
if(count % 10 == 0)
printf("\n");
}
//执行到这里就完成了对一个数字的判断
//继续执行外层for循环,对下一个数字进行判断
}
}
运行结果如下图:
声明:文章属作者原创,禁止抄袭搬运,转载请注明作者