素數篩
#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;
}
#define PC 1230 是根據輸入10000,輸出k值等於1228 而設置的
素數篩還有時間和空間的優化版本
待更新
問題1:如何打一張指定閉區間的素數表
不錯的習題:
Prime Product
http://acm.szu.edu.cn/wiki/index.php/Problem:J23:Prime_Product
Prime Distance
http://poj.org/problem?id=2689