埃氏筛
高效筛选出某个范围内所有质数 的经典算法
思路:假设我们想找出 2 ~ N 之间的所有质数:
先假设 2~N 都是质数。
从 2 开始,把它的所有倍数(2×2, 2×3, 2×4…)都标记为合数。
再找到下一个未被标记的数(一定是质数),然后把它的所有倍数标记为合数。
不断重复,直到处理到 √N 为止。
剩下所有未被标记的数就是质数。
C代码
1 2 3 4 5 6 7 8 9 10 11
| // 初始化 for (int i = 2; i <= n; i++) isPrime[i] = true;
// 埃氏筛 for (int i = 2; i * i <= n; i++) { if (isPrime[i]) { for (int j = i * i; j <= n; j += i) { isPrime[j] = false; } } }
|
从小到大,遇到质数就划掉他的倍数
we gt introduce the vise of eula
compared with vise of esteranis, this vise would’t get any re-count if its not prime, let start
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| C form
#include <stdbool.h> #include <stdlib.h>
void vise_of_eula(int num){ if(num < 2){ obviously, no prime } bool *is_composite = (bool*) calloc(num+1, sizeof(bool)); int *Primes = (int*) malloc((num+1) * sizeof(int)),cnt = 0; for(int i = 2; i <= num; i++){ if(!is_composite){ Primes[cnt++] = i; } for(int j = 0; j < cn && i * Primes[j] <= num; j++){ is_composite[i * Primse[j]] = true; if(i % Primse[j] == 0) break; }
} free(is_composite); int *final_Prime = realloc(Primes, cnt*sizeof(int)); free(Primes); }
|