素数筛法,以51nod1181为例

我很久没写素数筛了,今天遇到,忘记怎么写了,惭愧惭愧。不过我重新找了一份素数筛代码,从空间利用率上,比之前的好上不少,特此记录。

题目在这里

代码

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
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 1000000;
int prime[maxn + 1];
vector<int> v;
void is_p()
{
for (int i = 2; i <= maxn; i++)
{
if (prime[i] == 0)
prime[++prime[0]] = i;
for (int j = 1; j <= prime[0] && prime[j] <= maxn / i; j++)
{
prime[prime[j] * i] = 1;
if (i % prime[j] == 0)
break;
}
}
}
int main()
{
is_p();
/*printf("%d\n",prime[0]);*/
for (int i = 2; i <= prime[0]; i++)
{
if (*lower_bound(prime + 1, prime + prime[0], i) == i)
{
v.push_back(prime[i]);
}
}
int N;
scanf("%d", &N);
printf("%d", *lower_bound(v.begin(), v.end(), N));
return 0;
}
0%