--------- teorema de los números primos de

Dados dos números enteros L y U, que necesita el intervalo cerrado [L, el U-] para encontrar la distancia más cercana de dos primos adyacentes C1 y C2 (es decir, C2-C1 es la más pequeña), el otro con la misma distancia si hay o par de números primos, la salida del primer par.
Al mismo tiempo, también es necesario para encontrar la mayoría de los dos números primos lejanos adyacentes D1 y D2 (es decir, D1-D2 es el más grande), la presencia de otro número primo adyacentes si la misma distancia, la salida del primer par.
El formato de entrada
de cada línea de entrada de dos números enteros L y T, T y L, en el que la diferencia no sea superior a 1.000.000.
formato de salida
para cada uno de los L y T, dar salida a un resultado, una fila de resultados.
Los resultados incluyen el número del vecino más cercano y más lejano de la calidad de pares de números primos adyacentes. (Consulte el formato específico de la muestra)
, si un número primo no está presente entre la L y U par, la salida "No hay números primos adyacentes." .
Rango de datos
1≤L <U≤231-11≤L <U≤231-1
muestra de entrada:
2. 17
14. 17

Resultado de muestra:
2, 3 son los más cercanos, 7, 11 son más distantes.
Hay primos NO adyacente.

Pensando: tamiz lineal seleccionada sólo el número de 1-n, pero para filtrar un gran número de ahora, según la naturaleza de cada uno de un gran número n existe una menor raíz factores primos de n, la primera filtra todos los factores primos de n 1 a la raíz, y luego tomar estos factores primos número de acoplamiento seleccionados dentro de esos rangos, y luego enumeran secuencialmente 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;
}
Publicados 106 artículos originales · ganado elogios 67 · vistas 5430

Supongo que te gusta

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