【2048】筛法求素数

来源:互联网 发布:程序员文史综合题目 编辑:程序博客网 时间:2024/05/21 17:11

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


 

0 0
原创粉丝点击