1013 数素数 (20分) 四号测试点需注意
令 Pi表示第 i 个素数。现任给两个正整数 M≤N≤10^4,请输出 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
思路:套欧拉筛和埃筛(素数筛)
筛子不清楚的可以看这篇
【超级传送】
还有注意格式,十个换一行。
我写了两个一个是光埃筛的,一个是欧拉筛套埃筛的
注意第四个测试点:它是在测第10000个 第10000是等于104729所以maxx>104729
但也不能开太大 会t 埃筛的用时是O(nlognlogn) 欧拉筛用时是O(n)
代码:
第一种
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxx 1000006 //注意
typedef long long ll;
bool num[maxx];
ll prime[maxx],x=0;
void isprime(int n)
{
for(int i=2;i<n;i++)
{
if(!num[i])
prime[x++]=i;
for(int j=2;i*j<n;j++)
{
num[i*j]=true;
}
}
}
int main()
{
isprime(maxx);
ll m,n;
scanf("%lld %lld",&m,&n);
int k=0;
for(int i=m-1;i<n;i++)
{
if(k==0)
printf("%lld",prime[i]);
else
printf(" %lld",prime[i]);
k++;
if(k==10)
{
k=0;
printf("\n");
}
}
return 0;
}
第二种
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
#include<iomanip>
using namespace std;
typedef long long ll;
#define maxx 10000008 //注意
bool num[maxx];
int prime[maxx],x=0;
void isprime(int n)
{
for(int i=2;i<n;i++)
{
if(!num[i])
{
num[x]=i;
x++;
}
for(int j=2;j*i<=n;j++)
{
num[i*j]=true;
}
}
}
void oulasai(int n)
{
for(int i=2;i<=n;i++)
{
if(!num[i])
prime[x++]=i;
for(int j=0;j<x;j++)
{
if(i*prime[j]>n)
break;
num[i*prime[j]]=true;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
int n,m;
oulasai(maxx);
scanf("%d %d",&n,&m);
int k=0;
for(int i=n-1;i<m;i++)
{
if(k==0)
printf("%d",prime[i]);
else
printf(" %d",prime[i]);
k++;
if(k==10)
{
k=0;
printf("\n");
}
}
//printf("\n");
return 0;
}