质数筛法
坑待填
埃氏筛
原理
对\(0\)、\(1\)特判后枚举\([2,\sqrt{N}]\)内的数,
通过标记这些数的合数的方式来进行筛选。
代码实现
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e2 + 6;
int input_arr[MAX_N];
int input(int *input_arr)
{
int amount;
cin >> amount;
int input_num;
for (int i = 0; i < amount; ++i)
{
cin >> input_num;
input_arr[i] = input_num;
}
// 一开始的amount被input()读走了,可main()里还要再用一次
// 因为作用域的存在,main不能直接使用input里的amount,
// 所以input就需要把amount的值再返还给main
// 这样main才知道amount的值
// (其实直接在main里读取,然后以参数的形式传入input也是可以的)
return amount;
}
const int MAX_PRIME = 1e5 + 6;
// 如果下标对应的数字不是质数,那么它就会被赋值为1(true),而其他的则为初始值0(false)
bool prime_by_sub[MAX_PRIME];
// 埃氏筛
void era_prime(void)
{
prime_by_sub[0] = prime_by_sub[1] = 1;
for (int i = 2; i <= sqrt(MAX_PRIME); ++i)
{
// 这里j从i * i开始,因为i * i之前的数字都被筛过了,
// j += i即j是i的倍数
for (int j = i * i; j <= MAX_PRIME; j += i)
{
prime_by_sub[j] = 1;
}
}
}
int main(void)
{
// 输入
int amount = input(input_arr);
// 开筛
era_prime();
// 输出结果
for (int i = 0; i < amount; ++i)
{
// 如果第i个数在prime_by_sub中是0(false,没有被动过),那么它是质数
if ( ! prime_by_sub[ input_arr[ i ] ] )
{
cout << input_arr[i] << " ";
}
}
return 0;
}