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("\n");
}
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;
}