试除法:
bool is_prime(int n)
{if (n <= 1) return false;for (int i = 2;i<=sqrt(n);i++)//这样写更好!if (n % i==0) return false;return true;
}
埃式筛选法:
const int N = 1e7;
int prime[N + 1];
bool vis[N + 1];int n_prime(int n) {int k = 0;memset(vis, 0, sizeof(vis));for (int i = 2; i <= n; i++)if (!vis[i]) {prime[k++] = i;for (int j = 2 * i; j <= n; j += i)vis[j] = true;}return k;
}
优化后的埃式筛选法:
const int N = 1e7;
int prime[N + 1];
bool vis[N + 1];bool n_prime(int n) {memset(vis, 0, sizeof(vis));for (int i = 2; i <= n; i++) {if (!vis[i])for (int j = i * i; j <= n; j += i)vis[j] = true;}int k = 0;for (int i = 2; i <= n; i++)if (!vis[i])prime[k++] = i;return k;
}
题目描述
用筛法求之N内的素数。
输入
N
输出
0~N的素数
样例输入
100
样例输出
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
举例:
代码如下:
#include <iostream>
using namespace std;
int k;
const int N = 10010;
int p[N];
bool vis[N];void fff(int n)
{for (int i = 2;i<=n;i++)if (!vis[i])for (int j = i*i;j<=n;j+=i){vis[j] = true;}k = 0;for (int i = 2;i<=n;i++){if (!vis[i]) p[k++] = i;}
}int main()
{int n;cin>>n;fff(n);for (int i = 0;i<k;i++){cout<<p[i]<<endl;}return 0;
}