素数即为质数,除了一之外只能被自己整除。
这里我们用寻找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为素数。
方法三优化了前两种方法,使计算效率大大提升。