目录
题目:

思路:
一、利用循环将2~n以内的正整数存入数组中,从下标2开始存,0、1下标不存数据,初始值为0。
二、用内外层循环进行筛选,外层循环遍历2~n的数,内层循环遍历外层循环数的2倍的所有的数,依次将所外层循环数的所有倍数值设置为0,设置变量计算为0的个数。
三、二步骤完成后,再次遍历数组,将 不为0的数即素数还有count打印输出。
源码:
int main()
{
int n;
int arr[101];
while (scanf("%d", &n) != EOF)
{
//输入数据
for (int i = 2; i <= n; i++)
{
arr[i] = i;
}
//筛选数据
int count = 0;
//外层循环
for (int i = 2; i <= n; i++)
{
if (arr[i] != 0)
{
//内层循环
for (int j = 2 * i; j <= n; j += i)
{
if (arr[j] != 0)
{
arr[j] = 0;
count++;
}
}
}
}
//输出数据
for (int i = 2; i <= n; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
printf("\n");
printf("%d", count);
}
}
为什么0、1下标不用?
1、从下标2开始存入数据时,下标即为存入数组的数据,如arr[2]=2,arr[3]=3,便于理解筛选过程。
2、循环条件i<=n直接对应数值范围2~n,无需处理0和1的特殊情况。
3、数组101仅限制两个空间(0,1下标),空间成本极低,却换来了代码的简洁性和可读性。
634

被折叠的 条评论
为什么被折叠?



