个人描述
这也是一个用空间换时间的方法,速度固然是快,但是你要求多大上限的质数就需要多大上限的数组,这在一定程度上限制的大数的范围。有解决方法?留待以后闲时研究。
应用原理
因式分解定理: 任何一个非质数都可以分解成质数的连乘积
即:合数 n = pkq (p < q)
因此在删除非质数时,如果已知 p 是质数,可以先删除 p2, p3, p4….,接着找出比 p 大的而且没有被删除的数 q,然后删除pq, p2q, p3q…,一直到 pq > n为止。
代码示例:
#include <stdio.h>#include <stdlib.h>#define MAX_COUNT 10000#define NEXT(x) x = next[x]#define PREV(x) x = prev[x]#define REMOVE(x) { next[prev[x]] = next[x]; \prev[next[x]] = prev[x];}#define INIT(n) { unsigned long i; \for(i = 2; i <= n; i++){ \next[i] = i + 1; \prev[i] = i - 1; \} \prev[2] = next[n] = NULL; \}int main(int argc, char** argv){unsigned long num, count;unsigned long prime, factor, multi;unsigned long next[MAX_COUNT + 1];unsigned long prev[MAX_COUNT - 1];printf("%s", "please input the upper num\n");scanf("%d", &num);INIT(num);for(prime = 2; prime * prime <= num; NEXT(prime)){for(factor = prime; prime * factor <= num; NEXT(factor)){for(multi = prime * factor; multi <= num; multi *= prime){REMOVE(multi);}}}for(prime = 2, count = 0; prime != NULL; NEXT(prime)){if(count++ % 8 == 0){printf("\n");}printf("%8ld", prime);}return 0;}