Bootstrap

【C】遍历素数的三种方法

素数即为质数,除了一之外只能被自己整除。
这里我们用寻找100到200中的素数作为例子。
方法一:试除法

#include <stdio.h>
int main() {
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i++) {//100一定不是素数,所以从101开始
		int j = 0;
		for (j = 2; j <= i; j++) {//0和1不是素数,从2开始
			if (i % j == 0) {
				break;
			}
		}
		if (i == j) {
			count++;
			printf("%d ", i);
		}
	}
	printf("\ncount=%d\n", count);
	return 0;
}

定义一个i,它的作用是用来遍历从100到200的数,在此循环中,再次定义一个j,它的功能是从2开始,到i结束,以此来判断每一个i有无除了i本身与1还有无其他约数,
当j能被i整除时,说明此时i除了本身与1两个约数,还有另外一个约数,也就不是素数,结束循环。

方法二:

int main() {
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i++) {
		int j = 0;
		for (j = 2; j <= i/2; j++) {
			if (i % j == 0) {
				break;
			}
		}
		if (j > i/2) {
			count++;
			printf("%d ", i);
		}
	}
	printf("\ncount=%d\n", count);
	return 0;
}

方法一中有大量多余的运算,因为如果一个数大于i/2,那么它一定无法被i整除,所以我们仅需计算j<=i/2的情况。如果j>i/2则说明j在2到i/2中没有被整除,则这时为素数。

方法三:

int main() {
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2) {
		int j = 0;
		for (j = 2; j <= sqrt(i); j++) {
			if (i % j == 0) {
				break;
			}
		}
		if (j > sqrt(i)) {
			count++;
			printf("%d ", i);
		}
	}
	printf("\ncount=%d\n", count);
	return 0;
}

当我们引用sqrt时,i的两个因子相等,如果能被i整除,则必定有一个因子小于这个因子,另外一个因子大于这个因子,而且在素数中,除了2与3,没有相连贯的素数,所以将i++改成i+=2,当这个j大于其中那个大的因子时说明没有任何等于sqrt(i)或小于sqrt(i)能整除i,所以此时i为素数。
方法三优化了前两种方法,使计算效率大大提升。

;