题目:筛选法输出100以内的所有素数
从2开始,2—100之内的数字可以整除2的,就删除,然后到3,2—100可以整除3的数字,删除,以此类推。题目解决如下,因为数字本质无法删除,所以定义一个数组来当作数字的标记,0,1不参与到素数选择中,所以开始标记为1,其实满足条件的默认素数全部标记为0;然后进行筛选,考虑到若之前筛选过2,则后表2的倍数4,6之类的数字就不考虑在内,也就是若当前下表已经为1;就提前结束此趟循环,实现如下:
void num1()
{
int arr[101]={1,1};//0,1两个数字不参与素数选则
for(int i=2;i < 101; ++i)
{
for(int j=i+1;j < 101;++j)
{
if(arr[j] == 1)//之前检测过的非素数数字就跳过
{
continue;
}
if(j%i == 0)
{
arr[j]=1;
}
}
}
for(int i = 2;i < 101;++i)
{
if(arr[i] == 0)
{
printf("%d ",i);
}
}
}
考虑到输出素数的要求可以随意变换,所以加入供选择的范围,修改如下
这里注意,在main函数中若要找出200以内的素数,则对应的数组长度需要设置为201,也就是素组长度要求比范围大一,否则筛选时会把结尾数字丢掉
void num(int *arr,int len)//筛选法输出arr数组内所有素数
{
for(int i=2;i <= len-1;++i)
{
for(int j = i+1;j <= len-1;++j)
{
if(arr[i] == 1)
{
continue;
}
else if(j%i == 0)
{
arr[j] = 1;
}
}
}
for(int i = 2;i <= len;++i)
{
if(arr[i] == 0)
{
printf("%d ",i);
}
}
}