【2048】筛法求素数

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;
}


 

posted @ 2017-10-06 19:23  AWCXV  阅读(209)  评论(0编辑  收藏  举报