质数的定义:
要用代码判断一个数是否是质数,首先我们需要知道什么什么数称之为质数。质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
代码实现:
以下有三种方法判定质数:
方法一:暴力枚举
通过从2到n-1每个数均整除判断,若能被整除,则不是素数。
int is_prime(int n) {int i = 0;if (n < 2)return 0;//2是最小的质数,如果n小于2,那n肯定就不是质数for (i = 2; i < n; i++) { //从最小的质数2开始枚举到n - 1if (n % i == 0) return 0;//如果可以被i整除,说明这个数不是质数,返回0}return 1;//满足定义返回1}
方法二:使用根号sqrt优化
将for种的判定条件改为i <= sqrt(n),减少程序的执行次数。
int is_prime(int n) {int i = 0;if (n < 2)return 0;for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) return 0;}return 1; }
因为一个数的因数是成对出现的,其中一个因数在开方后的前面一个在开方后的后面,所以只需判断它前面的数就可以了,如果前面都没有,那么它后面更不会有.这样就可以减少循环次数.例如举例36这个数,有因数有1和36、2和18、3和12、4和9、6和6,36开更号为6,则只需要判断包括6在内的前面的数,如果找不出因数,那么后面也必然没有因数。
方法三:使用i*i<=n优化
可以看成两边平方,就去掉了n的根号,则不需调用库函数sqrt(),节约了资源。
int is_prime(int n) {int i = 0;if (n < 2)return 0;for (i = 2; i * i<= n; i++) { if (n % i == 0) return 0;}return 1; }
调用函数求100-1000以内的所有质数:
代码如下:
int is_prime(int n) {int i = 0;if (n < 2)return 0;for (i = 2; i * i<= n; i++) { if (n % i == 0) return 0;}return 1; }int main() {int i;for (i = 101; i <= 1000; i+=2) {//由于偶数一定不是质数,所以可以不用每次加1遍历if (is_prime(i))printf("%d\t",i);}}