一、素数是什么?
素数(prime number)又称质数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
二、解题思路
1. 思路一
首先判断一个数i是否为素数最简单的方法就是将i与2 ~ i - 1范围内的数分别相除来判断是否为素数,如果i不能被范围内的数整除,即为素数。
注意:下面的代码中第二层for循环当n = 99时,再次n++后,不符合要求跳出循环,这个时候i == n进入if语句中打印素数i。
代码如下:
还可以定义一个整型变量m = 1,如果i能被整除,m将被赋值为0,如果不能将进入if(m == 1)语句中被打印出来。
代码如下:
2. 思路二
假设i = 101,当进入第二层for循环时i要和2 ~ i - 1范围内的所有数都相除一次才能得出结果,判断次数太多不够好。
这里要引入一个点:
i = a * b,a和b中一定至少有一个数字是小于等于开平方i的。也就意味着在2 ~ sqrt(i)的范围里 (这里的sqrt()是用来计算i开平方的函数)没有可以把i整除的数时,这时就可以判断i为素数,反之如果有那么i就为合数。
例16 = 2 * 8或16 = 4 * 4,这里将16开平方,发现符合上述论点。这里的2和4一定是小于等于16开平方。在2 ~ 4这个范围里有可以将16整除的数,所以16为合数。
按照这个思路只需要用2 ~ sqrt(i)这个范围里的数来与i分别相除,来判断i是否可以被整除,这样范围会大幅减小。
注意:
这里引入的库函数sqrt()需要先一开始导入头文件#include <math.h>。
代码里的i为整型sqrt(i)要向下取整。
代码如下:
3.优化
上面的程序将100 ~ 200范围内的数都判断了一遍,但是偶数都可以被2整除,所以这里可以将所有的偶数都跳过,这样效率将会成倍增长。
代码如下:
总结
以上是我对这道题的解题思路,小白一枚,如有错误欢迎大家提出,感谢!!!