Time Limit: 1 second
Memory Limit: 2 MB
问题描述 由希腊著名数学家埃拉托斯尼斯提出的所谓“筛法”,是一种高效率的求素数的方法。请用集合的方式来实现这一算法,求2~n(n<=200)之间的素数。
Input
一行,一个小于200的整数n。
Output
多行,每行输出10个数字,每个数字采用场宽5。
Sample Input
40
Sample Output
2 3 5 7 11 13 17 19 23 29 31 37(换行)
【题解】
先剔除1,然后最小的数字是2,再把2的倍数剔除,接下来最小的数字是3.再把3的倍数剔除。最小的数字是5,再。。
每次最小的数字就是质数。
【代码】
/* */ #include <cstdio> const int maxn = 200; bool bo[maxn + 10]; int n; void input_data() { scanf("%d",&n); for (int i = 1;i <= n;i++) //每个数字都在筛子中 bo[i] = true; } void get_ans() { int num = 0,j = n-1,i = 2; //j表示筛子中剩余的数 bo[1] = false; while (j != 0) //如果筛子中还有数就继续晒 { printf("%5d",i); num++; if (num == 10) //如果已经输出10个了就换行 { num = 0; printf(" "); } for (int m = i;m <= n;m++) //剔除i的倍数 if ( (bo[m]) && ((m % i) == 0)) //要注意不要重复筛同一个数。不然会死循环。。 { bo[m] = false; j--; } if (j ==0) break; while (bo[i] == false) i++; //找下一个最小的数。 } } int main() { input_data(); get_ans(); return 0; }