- 方法一为简单暴力法,逐个检查从2到n-1的每个数是否能整除n。
#include <stdio.h>
// 方法一:简单暴力法
int isPrime1(int num) {
if (num < 2) return 0;
for (int i = 2; i < num; i++) {
if (num % i == 0) {
return 0; // 不是素数
}
}
return 1; // 是素数
}
方法二在方法一的基础上进行了优化,仅需检查从2到sqrt(n)的数。
// 方法二:优化暴力法
int isPrime2(int num) {
if (num < 2) return 0;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return 0; // 不是素数
}
}
return 1; // 是素数
}
- 方法三采用试除法,首先检查2和偶数,再检查从3到sqrt(n)的奇数。
// 方法三:试除法
int isPrime3(int num) {
if (num < 2) return 0;
if (num == 2) return 1;
if (num % 2 == 0) return 0;
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) {
return 0; // 不是素数
}
}
return 1; // 是素数
}
- 方法四为埃氏筛法,先构建一个素数表,逐步筛选出非素数。
// 方法四:埃氏筛法
int isPrime4(int num) {
if (num < 2) return 0;
int prime[num + 1];
for (int i = 2; i <= num; i++) {
prime[i] = 1;
}
for (int p = 2; p * p <= num; p++) {
if (prime[p] == 1) {
for (int i = p * p; i <= num; i += p) {
prime[i] = 0;
}
}
}
return prime[num];
}
int main() {
int num = 17; // 要判断的数
if (isPrime1(num))
printf("%d 是素数\n", num);
else
printf("%d 不是素数\n", num);
if (isPrime2(num))
printf("%d 是素数\n", num);
else
printf("%d 不是素数\n", num);
if (isPrime3(num))
printf("%d 是素数\n", num);
else
printf("%d 不是素数\n", num);
if (isPrime4(num))
printf("%d 是素数\n", num);
else
printf("%d 不是素数\n", num);
return 0;
}
```