PAT(B) 1013数素数(20)

来源:互联网 发布:虚拟机ubuntu文件共享 编辑:程序博客网 时间:2024/05/16 11:45

题目链接

令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

方法一:用常规方法sqrt查找,效率较低,并且最后一有个测试点运行超时,未通过.
代码如下:

#include<iostream>#include<cmath>using namespace std;int main(){    int M,N;    int num;    int t=2;    cin>>M>>N;    int *a = new int[N];    a[1] = 2;        for (int i = 2;i>0;i++)        {            num = 0;            for(int j=2;j<sqrt(i)+1;j++)            if(i%j==0)num=num+1;            if (num == 0) { a[t] = i;t = t + 1;}            if (t>N)break;        }      for(int i=M;i<N;i++)    {           if((i-M+1)%10==0)        cout<<a[i]<<endl;        else        cout<<a[i]<<" ";    }    cout << a[N];    delete[] a;    return 0;}

方法二:用筛法查找,效率大大提升。(首先根据方法一找出第10000个素数为104729)

#include<iostream>using namespace std;int main(){    int M,N;    cin>>M>>N;    const int maxn=110000;    bool flag[maxn];    for(int i=2;i<=maxn;i++)    flag[i]=true;    for(int i=2;i*i<=maxn;i++)    {        if(flag[i])        {            for(int j=2*i;j<=maxn;j=j+i)            flag[j]=false;        }    }    int a[maxn],n=0;    for(int i=2,j=0;i<=maxn;i++)    {        if(flag[i])        {            j++;            if(j>=M)            {                a[n++]=i;                if(j==N)break;            }        }    }    for(int i=0;i<n;i++)    {        cout<<a[i];        if((i+1)%10==0)cout<<endl;        else if(i+1<n)cout<<" ";    }    return 0;}
0 0
原创粉丝点击