最佳答案
引言
在編程範疇,尤其是算法跟數據構造的進修中,篩法是一種非常經典且高效的算法。它重要用於尋覓一定範疇內全部的素數。本文將深刻剖析C言語中實現的埃拉托斯特尼篩法(Eratosthenes Sieve),並探究其背後的道理跟利用。
埃拉托斯特尼篩法道理
埃拉托斯特尼篩法是一種經由過程打消法來找出一定範疇內全部素數的算法。基本頭腦是從最小的素數開端,逐步打消它的倍數,剩下的即為素數。
篩法步調
- 初始化一個布爾數組,用於標記每個數能否為素數。
- 從2開端,將全部2的倍數(除了2本身)標記為非素數。
- 找到下一個未被標記的數,假設為p,則p是素數。
- 將p的全部倍數標記為非素數。
- 重複步調3跟4,直到遍歷完全部數。
優化
為了進步效力,可能採用以下優化辦法:
- 只須要遍歷到根號n,因為假如一個數n不是素數,它必定有一個因子小於或等於根號n。
- 因為2是唯一的偶數素數,因此可能忽視全部偶數的檢查。
C言語實現
下面是利用C言語實現的埃拉托斯特尼篩法代碼示例:
#include <stdio.h>
#include <math.h>
#include <string.h>
void Eratosthenes(int n) {
int *isPrime = (int *)malloc((n + 1) * sizeof(int));
memset(isPrime, 1, (n + 1) * sizeof(int));
for (int i = 2; i <= sqrt(n); i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = 0;
}
}
}
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
printf("%d ", i);
}
}
printf("\n");
free(isPrime);
}
int main() {
int n;
printf("Enter the upper limit for prime numbers: ");
scanf("%d", &n);
if (n < 2) {
printf("The number must be greater than 1.\n");
return 0;
}
Eratosthenes(n);
return 0;
}
代碼剖析
isPrime
數組用於標記每個數能否為素數。- 利用
memset
初始化數組,全部數都標記為素數。 - 外層輪回遍歷到根號n,內層輪回用於標記以後素數的倍數。
- 打印全部未被標記為非素數的數。
總結
埃拉托斯特尼篩法是一種簡單而高效的算法,實用於尋覓一定範疇內的全部素數。經由過程C言語實現該算法,可能幫助我們更好地懂得其道理,並在現實編程中利用這一技能。