Dado dois inteiros L e L, é necessário o intervalo fechado [G, a U-] para encontrar a distância mais próxima de dois números primos adjacentes C1 e C2 (i.e., C2-C1 é o mais pequeno), o outro com a mesma distância, se houver o número primo par, a saída do primeiro par.
Ao mesmo tempo, também é preciso encontrar o mais distante dois primos adjacentes D1 e D2 (isto, D1-D2 é o maior), a presença de outro número primo adjacente se a mesma distância, a saída do primeiro par.
formato de entrada
de cada linha de entrada de dois inteiros L e L, L e L, em que a diferença não seja superior a 1.000.000.
formato de saída
para cada um de L e U, produzir um resultado, um resultado de linha.
Os resultados incluem o número do vizinho mais próximo e mais distante qualidade de pares de números primos adjacentes. (Consulte o formato específico da amostra)
, se um número primo não está presente entre o par L e U, a saída "não existem primos adjacentes." .
intervalo de dados
1≤L <U≤231-11≤L <U≤231-1
Amostra de entrada:
2. 17
14. 17
Exemplo de saída:
2, 3 são mais próximo, 7, 11 estão mais distantes.
Há primos NÃO adjacentes.
Pensando: linear peneira seleccionado apenas o número de 1-N, mas para filtrar para fora uma grande quantidade de agora, de acordo com a natureza de cada um de um grande número n existe uma raiz menos factores primos de n, o primeiro filtra todos os factores primários de n 1 para a raiz, e, em seguida, tomar estes factores primos seleccionados número de engate dentro desses intervalos, e em seguida, sequencialmente enumerados comparativo
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 1000010;
typedef long long LL;
int primes[N], cnt;
bool st[N];
void init(int n){
memset(st, 0, sizeof st);
cnt = 0;
for (int i = 2; i <= n; i ++){
if (!st[i]) primes[cnt ++] = i;
for (int j = 0; primes[j] * i <= n; j ++){
st[i * primes[j]] = true;
if (i % primes[j] == 0) break;
}
}
}
int main(){
int l, r;
while(cin >> l >> r){
init(50000);
memset(st, 0, sizeof st);
for(int i = 0; i < cnt; i ++){
LL p = primes[i];
for (LL j = max(2 * p, (l + p - 1) / p * p); j <= r; j += p)
st[j - l] = true;
}
cnt = 0;
for (int i = 0; i <= r - l; i ++)
if (!st[i] && i + l >= 2)
primes[cnt ++] = l + i;
if (cnt < 2) puts("There are no adjacent primes.");
else{
int minp = 0, maxp = 0;
for (int i = 0; i + 1 < cnt; i ++){
int d = primes[i + 1] - primes[i];
if (d < primes[minp + 1] - primes[minp]) minp = i;
if (d > primes[maxp + 1] - primes[maxp]) maxp = i;
}
printf("%d,%d are closest, %d,%d are most distant.\n",
primes[minp], primes[minp + 1],
primes[maxp], primes[maxp + 1]);
}
}
return 0;
}