1、简单的遍历和标志位
#include <stdio.h>
int main() {
int i, j, isPrime;
printf("1到100之间的素数:\n");
for (i = 2; i <= 100; i++) {
isPrime = 1;
for (j = 2; j <= i / 2; j++) {
if (i % j == 0) {
isPrime = 0;
break;
}
}
if (isPrime == 1) {
printf("%d ", i);
}
}
return 0;
}
2、使用开平方来优化
#include <stdio.h>
#include <math.h>
int main() {
int i, j, isPrime;
printf("1到100之间的素数:\n");
for (i = 2; i <= 100; i++) {
isPrime = 1;
for (j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
isPrime = 0;
break;
}
}
if (isPrime == 1) {
printf("%d ", i);
}
}
return 0;
}
3、埃拉托斯特尼筛法
#include <stdio.h>
#include <string.h>
int main() {
int n = 100;
int isPrime[n+1];
memset(isPrime, 1, sizeof(isPrime)); // 初始化数组为1,表示所有数都是素数
isPrime[0] = isPrime[1] = 0; // 0和1不是素数
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = 0;
}
}
}
printf("1到100之间的素数:\n");
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
printf("%d ", i);
}
}
return 0;
}
4、递归判断素数
#include <stdio.h>
int isPrime(int n, int i) {
if (n <= 2) {
return (n == 2) ? 1 : 0;
}
if (n % i == 0) {
return 0;
}
if (i * i > n) {
return 1;
}
return isPrime(n, i + 1);
}
int main() {
printf("1到100之间的素数:\n");
for (int i = 2; i <= 100; i++) {
if (isPrime(i, 2)) {
printf("%d ", i);
}
}
return 0;
}
5、用数组标记已处理过的数字
#include <stdio.h>
#include <stdbool.h>
int main() {
bool isPrime[101];
for (int i = 0; i <= 100; i++) {
isPrime[i] = true;
}
for (int i = 2; i <= 100; i++) {
if (isPrime[i]) {
for (int j = 2 * i; j <= 100; j += i) {
isPrime[j] = false;
}
}
}
printf("1到100之间的素数:\n");
for (int i = 2; i <= 100; i++) {
if (isPrime[i]) {
printf("%d ", i);
}
}
return 0;
}