número B1013 números primos (20 minutos)

1013 números primos números (20 minutos)

Así que P i denota el i-ésimo número primo. La corriente a ambos enteros positivos M≤N≤10 ^ 4, la salida P a P M solicitó
toda N. número primo
Formato de entrada:
entrada dada M y N en una fila, separadas por un espacio entre ellos.

Formato de salida:
salida de P
M
a P
N
todos los números primos, cada uno representando una línea de dígitos 10, separados por espacios entre los mismos, el extremo de la línea no puede tener espacio extra.

Entrada de muestras:
527

Muestra de la salida:
1,113,171,923,293,137 43 es 41 es
4,753,596,167,717,379 83 89
97 101 103

análisis

Buscando salida de los números primos,

  • Primes determinados grupo voxel utilizan método de cribado. "notas" Algoritmo ∂ P162.
  • la salida de recorrido
  • 49 ms
#include <iostream>
using namespace std;
const int maxn = 1000010;
int m [maxn];
void isPrime(){
    for (int i=2; i<maxn; i++) {
        for (int j=2*i; j<maxn&&j+i<maxn; j+=i) {
            m[j] = 1; }
    }
}
int main(){
    int p,q;
    cin >> p >> q;
    isPrime();
    int j=0;
    int co=0;
    for (int i=1;i<=maxn;i++){        
        if(m[i]==0){
            if(co>=p&&co<=q){
            if(j%10!=0)cout << " ";
            cout << i;        
            if (j%10==9) {
                cout << endl;
            }  j++;
            }
            if(co==q){
                break;
            }
            co++ ;            
        }
    }
}

Código de optimización:

Código notas algoritmo de aprendizaje

  • ordenado
  • Algunos de menor complejidad
  • 10 ms
#include <iostream>
using namespace std;
const int maxn = 1000010;
int co=0;
bool arr [maxn];
int pp [maxn];
void isPrime(int n){
    for (int i=2; i<maxn; i++) {
        if (arr[i] == false){
            pp[co++]=i;
            if(co>n){
                break;
            }
            for (int j =i+i; j<maxn; j+=i) {
                arr[j] = true;
            }
        }
    }
}
int  main(){
    int q,p,l=0;
    cin >> q >>p;
    isPrime(p);
    for (int i=q-1; i<p; i++) {
        cout << pp[i];
        l++;
        if (l%10!=0&&i<p-1) {
            cout << " ";
        }else cout << endl;
    }
    return 0;
}

Publicado 91 artículos originales · ganado elogios 9 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/WeDon_t/article/details/103817874
Recomendado
Clasificación