B1013-素数筛选法

来源:互联网 发布:南京java培训机构 编辑:程序博客网 时间:2024/05/17 07:17

题目:
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。

输入格式:

输入在一行中给出M和N,其间以空格分隔。

输出格式:

输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入样例:

5 27

输出样例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
计算N以内的素数的方法
寻找素数的算法都需要遍历,减小判断的次数才是关键。

1.素数的定义:任何一个大于1的自然数中除了1和本身之外没有其他的因子

for(i=2;i<n;i++){  for(j=2;j<i+1;j++)    if(i%j==0) break;  if(j==i+1) cout<<j;}

2.试图利用素数的性质减小循环次数

for(i=2;i<n;i++){  for(j=2;j<sqrt(n);j++)    if(i%j==0) break;  if(j==i+1) cout<<j;}

3.简单的素数的筛选法

bool* p=new bool [n+1];for(i=0;i<n+1;i++)  p[i]=true;p[0]=p[1]=false;for(i=2;i<sqrt(n);i++)  for(j=i+i;j<n+1;j=j+i)    p[j]=falsefor(i=0;i<n+1;i++)  if(p[i]) cout<<i;
```#include <iostream>#include <stdio.h>#include <math.h>using namespace std;int main(){    const int n=1000001;    int M,N;    cin>>M>>N;    bool* P;    P=new bool [n];    int i,j,k;    for(i=0;i<n;i++)        P[i]=true;    P[0]=P[1]=false;    for(i=2;i<sqrt(n);i++)      for(j=i+i;j<n;j=j+i)        P[j]=false;    j=0;    k=0;    for(i=0;i<n;i++)    {        if(P[i])        {            j++;            if(j>M-1&&j<N+1)            {                if(k)                {                    if(k%10==0)  cout<<'\n';                    else cout<<' ';                }                k++;                cout<<i;            }        }    }    return 0;}
1 0
原创粉丝点击