素数筛
#include <stdio.h> #include <string.h> #include <math.h> #define N 10000 int v[N];//visited indicated not prime int main(void) { int i, j, n, m; scanf("%d", &n); memset(v, 0, sizeof (int)); m = (int)sqrt(n+0.5); for (i = 2; i <= m; i++) { if (0 == v[i]) { for (j = i+i; j <= n; j += i) { v[j] = 1; } } } for (i = 2; i != n; i++) if (0 == v[i]) printf("%d\n", i); return 0; }
程序输入n(n < 10000),输出小于n的所有素数。
素数筛常常用来打一张素数表,也就是存入prime[]数组中,供以后查表用。(空间换时间的思想)
这张表的大小,可以预先统计一下表长,然后开适合大小的数组即可。
纯打表也可以这样写:
#include <stdio.h> #define N 10000 #define PC 1230 int v[N]; int prime[N]; int main(void) { int i, j, n, k; scanf("%d", &n); k = 0; for (i = 2; i <= n; i++) { if (0 == v[i]) { for (j = i+i; j <= n; j += i) { v[j] = 1; } prime[k++] = i; } } //printf("%d\n", k-1); return 0; }
素数筛还有时间和空间的优化版本
待更新
问题1:如何打一张指定闭区间的素数表
不错的习题:
Prime Product
http://acm.szu.edu.cn/wiki/index.php/Problem:J23:Prime_Product
Prime Distance
http://poj.org/problem?id=2689