我们可以将被划去的作上标记,这样我们后续筛掉这些带有标记的数字,即可拿到素数
#include<stdio.h>
#define WUQIONG 1500
void shai(int n)
{
//Ture存储标记,同时Ture的下标将表示数字,从0到n个数(因为从1到n的数的素数个数与从0到n的素数个数相同)
int Ture[WUQIONG+1];//本想创建n+1个元素的数组,奈何VS2022不支持变长数组
for (int i = 0; i <= n; i++)//初始化Ture数组
{
Ture[i] = 1;//标记为1表示素数
}
//0,1这两个数不为素数,标记为0
Ture[0] = 0;
Ture[1] = 0;
for (int i = 2; i * i <= n; i++)//慢慢向前移动的因子1,满足i<=sqrt(n)
{
for (int j = 2; j * i <= n; j++)//第二个因子2,且因子2初始为i。因为2*3 与3*2同义,因此当i等于3时,第二个因子初始也应为3
{
if (Ture[i] == 1)//当因子1为素数的时候,该素数的倍数都不是素数(因为该数不仅可以被1和本身整除,还可以被此时的因子1和因子2整除)
{
Ture[i * j] = 0;//因为只要是因子1的倍数的数都不为素数,因此做上不为素数的标记
}
}
}
for (int i = 0; i <= n; i++)//遍历数组Ture
{
if (Ture[i] == 1)//上文已经提到Ture的下标将表示数字,从0到n,当Ture的下标对应的标志为1时,表示该数为素数
{
printf("%d ", i);
}
}
}
int main()
{
int n;
scanf("%d", &n);
shai(n);
return 0;
}