1013 数素数 (20 分)
算法标签:欧拉筛
1013 数素数 (20 分)
令 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
思路:
注意
测试点4的数据尤其大,需要扩张到1e6
题目代码
欧拉筛
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
bool st[N];
int primes[N];
int cnt;
void getprimes(int u)
{
for (int i = 2; i <= u; i++)
{
if (st[i] == false)primes[cnt++] = i;
for (int j = 0; primes[j] * i <= u; j++)
{
st[primes[j] * i] = true;
if (i%primes[j] == 0)break;
}
}
}
int main()
{
int n, m;
cin >> n >> m;
getprimes(N);
for (int i = n - 1, step = 1; i < m; i++, step++)if (i == m - 1)cout << primes[i]; else if (step % 10 == 0)cout << primes[i] << endl; else cout << primes[i] << " ";
return 0;
}
普通判定
#include <iostream>
#include <math.h>
using namespace std;
int primeNum[1000001] = { 2,3,5,7 }, index = 4;
void prime(int N) {
int k = 0;
for (int i = 3; i <= 1000001; i += 2) {
for (int j = 3; j <= (int)sqrt(i); j++)
if (i%j == 0) break;
else if (j == (int)sqrt(i)) primeNum[index++] = i, k++;
if (k == N) break;
}
}
void primePut(int M, int N) {
int index = 0;
for (int i = M - 1; i <= N - 1; i++)
{
index++;
if (i == N - 1) cout << primeNum[i];
else if (!(index % 10)) cout << primeNum[i] << endl;
else cout << primeNum[i] << ' ';
}
}
int main()
{
int M, N;
cin >> M >> N;
prime(N);
primePut(M, N);
return 0;
}
标签:index,pat,int,++,素数,primes,include,1013
From: https://blog.51cto.com/u_16014765/6132939