本人菜鸡一枚,之前刷完了csp历年考试题,去考了csp考试,一塌糊涂···也刷了蓝桥杯,去考蓝桥杯,又是一塌糊涂···感觉自己也做了不少题目,可是一考试,自己就写不出了。我承认自己在刷题的时候也会忍不住去看题解,而且感觉自己有些太操之过急了,心急吃不了热豆腐,最后发现连简单的模板题都打不下来,总想着一口吃成个大胖子,而忽视了夯实基础。所以我打算从最简单的开始,多总结,多写博客,把自己一点一滴的努力记录下来,毕竟经济基础决定上层建筑嘛!
素数筛
虽然很简单,但是之前自己也只是掌握了很简单的算法,简单的算法也可以一步一步优化。
暴力法
时间复杂度O(n*sqrt(n))
埃及筛
时间复杂度O(n*loglogn)
欧拉筛
时间复杂度O(n)
#include <bits/stdc++.h>
using namespace std;
// 暴力
bool isPrime1(int x)
{
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
{
return false;
}
}
return true;
}
// 埃及筛
const int N = 10000000;
bool vis[N];
int prime[N], cnt;
void isPrime2(int n)
{
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
prime[cnt++] = i;
for (int j = i * i; j <= n; j += i)
{
vis[j] = true;
}
}
}
}
// 欧拉筛
void isPrime3(int n)
{
for (int i = 2; i <= n; ++i)
{
if (!vis[i])
{
prime[cnt++] = i;
}
for (int j = 0; j < cnt && prime[j] * i <= n; ++j)
{
vis[prime[j] * i] = true;
if (i % prime[j] == 0)
{
break;
}
}
}
}
int main()
{
int n;
cin >> n;
// for(int i=2;i<=n;++i){
// if(isPrime1(i)){
// cout<<i<<' ';
// }
// }
//isPrime2(n);
isPrime2(n);
for (int i = 0; i < cnt; i++)
{
cout << prime[i] << ' ';
}
return 0;
}