--------- teoria dos números primos de

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;
}
Publicado 106 artigos originais · ganhou elogios 67 · vista 5430

Acho que você gosta

Origin blog.csdn.net/qq_45772483/article/details/104940293
Recomendado
Clasificación