【问题】埃拉托色尼筛法简称埃氏筛法,基本思想是,假定区间[1, n]内的所有数都是素数,再去掉所有合数,剩下的就是所有素数。判断合数的方法是从 2 开始依次过筛,如果是 2 的倍数则该数不是素数,进行标记处理,直至将 n/2 过筛,将所有合数打上标记。
给定不大于500的整数n,要求采用埃氏筛法输出所有在[1,n]内的素数,同时输出筛选过程,见如下:
输入整数:20
输出如下内容:
第1次筛掉的数:4 6 8 10 12 14 16 18 20
第2次筛掉的数:6 9 12 15 18
第3次筛掉的数:10 15 20
第4次筛掉的数:14
素数:1 2 3 5 7 11 13 17 19
输入格式:
输入整数n,要求n小于等于500。
输出格式:
第1次筛掉的数:4 6 8 10 12 14 16 18 20
第2次筛掉的数:6 9 12 15 18
第3次筛掉的数:10 15 20
第4次筛掉的数:14
…
素数:1 2 3 5 7 11 13 17 19
注意:冒号是中文字符的冒号,输出的每个素数和合数后面都有一个空格。
输入样例:
在这里给出一组输入。例如:
20
输出样例:
在这里给出相应的输出。例如:
第1次筛掉的数:4 6 8 10 12 14 16 18 20
第2次筛掉的数:6 9 12 15 18
第3次筛掉的数:10 15 20
第4次筛掉的数:14
素数:1 2 3 5 7 11 13 17 19
#include<stdio.h>
int main() {
int n, count = 0,flag=0; //flag用来作标志
scanf_s("%d", &n);
int arr[501] = { 0 };
for (int i = 2; i <= n / 2; i++) {
for (int k = 2; k < i; k++) { //这个循环用来判断当前的i是否是质数
if (i % k == 0) {
flag = 1;
break; //一旦发现当前用来筛选的i不是质数就打断内层循环
}
}
if (flag == 1) {
flag = 0; //恢复
continue; //跳过这个i继续
}
count++;
printf("第%d次筛掉的数:", count);
for (int j = 1; j < n + 1; j++) {
if (j / i > 1 && j % i == 0) {
arr[j] = 1;
printf("%d ", j); //只打印当前筛掉的
}
}
printf("\n");
}
printf("素数:");
for (int i = 1; i < n + 1; i++) {
if (arr[i] == 0) {
printf("%d ", i);
}
}
}