Comprobando si un número es primo -- ++ campo con performance campo con beginner campo con c++11 campo con primes camp codereview Relacionados El problema

Checking if a number is prime


7
vote

problema

Español

¿Hay una mejor manera de comprobar si un número es un prime?

  Align9  
Original en ingles

Is there a better way to check if a number is a prime?

#include <iostream> #include <math.h>  using namespace std;  bool doAgain(); bool isPrime(int num);  int main() {     do {         int num = 0;         do {             cout << "Enter a positive integer to check: ";             cin >> num;         } while(num < 1);         if(isPrime(num)) {             cout << "Prime!!!" << endl;         } else {             cout << "Not a prime." << endl;         }     } while(doAgain());     cout << "Bye!" << endl; }  bool doAgain() {     while(true) {         cout << "Again? (Y/N) ";         char again;         cin >> again;         if(again == 'Y') {             return true;         } else if(again == 'N') {             return false;         }     } }  bool isPrime(int num) {     if(num < 2) {         return false;     } else if(num == 2) {         return true;     } else if(num % 2 == 0) {         return false;     }     for(int i = 3, max = sqrt(num); i < max; i += 2) {         if(num % i == 0) {             return false;         }     }     return true; } 
              
         
         

Lista de respuestas

15
 
vote
vote
La mejor respuesta
 

Desafortunadamente, su función ZALLOC4 devuelve resultados incorrectos para los cuadrados de números impares.

Esta es una supervisión bastante común, así que no te sientas tan mal.

Una mejor implementación de ZALLOC5 se parece más a esto:

  ZALLOC6  

En el primer ZALLOC7 , manejamos los casos especiales de ZALLOC8 a través de ZALLOC9 , así como todos los números negativos.

En el segundo, eliminamos todos los múltiplos de #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 0 y #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 1 .

Finalmente, en la captura, todo #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 2 , estamos manejando todo lo demás.

Al comenzar a #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 3 e incrementing by #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 4 , podemos omitir todos nuestros múltiplos de #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 5 y #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 6 que ya eliminamos. Por lo tanto, estamos revisando 2 / 3rds de los números sus cheques de implementación originales.

Además, debido a que estamos tratando con enteros, #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 7 es un poco mejor que #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 8 (que realmente necesita ser #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) 9 ).

 

Unfortunately, your isPrime function returns incorrect results for the squares of odd numbers.

This is a pretty common oversight though, so don't feel too bad.

A better implementation of isPrime looks more like this:

bool isPrime(int num) {     if (num <= 3) {         return num > 1;     } else if (num % 2 == 0 || num % 3 == 0) {         return false;     } else {         for (int i = 5; i * i <= num; i += 6) {             if (num % i == 0 || num % (i + 2) == 0) {                 return false;             }         }         return true;     } } 

In the first if, we handle the special cases of 0 through 3 as well as all of the negative numbers.

In the second, we eliminate all of the multiples of 2 and 3.

Finally, in the catch-all else, we're handling everything else.

By starting at 5 and incrementing by 6, we're able to skip all of our multiples of 2 and 3 which we already eliminated. So we're checking 2/3rds of the numbers your original implementation checks.

Moreover, because we're dealing with integers, i * i <= num is a bit better than i < sqrt(num) (which actually needs to be <=).

 
 
     
     
8
 
vote
  • No Use el espacio de nombres STD < / p>

  • Debe tener una advertencia de que 9988776655544330 puede devolver sin un valor. ¿Qué sucede si respondo Z a la solicitud?

  • Para probar un solo número, el enfoque es lo suficientemente bueno. Para sugerencias de múltiples consultas (como un lo sugiere) Recomiendo para precompuir una tabla de primos con su tamiz favorito.

  • <math>3 , 9988776655544334 y max no son estrictamente necesarios. i*i <= n Como condición de bucle es lo suficientemente bueno.

  • usando int Limita su programa innecesariamente. unsigned long le permite verificar números más grandes.

 
  • Do not use namespace std

  • You must've got a warning that doAgain may return without a value. What happens if I answer Z to the prompt?

  • To test a single number, the approach is good enough. For multiple queries (as a doAgain loop suggests) I recommend to precompute a table of primes with your favourite sieve.

  • <math>, sqrt and max are not strictly necessary. i*i <= n as a loop condition is good enough.

  • Using int limits your program unnecessarily. unsigned long lets you check larger numbers.

 
 
 
 
3
 
vote

Considera mirar en los tamices. Cosas como la Sieve of Erastothenes o el tamiz de atkin son realmente realmente rápido donde se trata de encontrar primes.

Básicamente, tiene una matriz de booleanos llamada algo como isPrime , y usted marca todos los números que son factores de algo. Luego, simplemente vaya al índice de matriz que representa el valor que desea verificar, y obtiene su respuesta bastante rápido. Por lo que Z0 y Z1 .

 

Consider looking into sieves. Things like the sieve of erastothenes or the sieve of atkin are really really quick where it comes to finding primes.

Basically, you have an array of booleans called something like isPrime, and you mark off all of the numbers that are factors of something. Then you just go to the array index representing the value you want to check, and you get your answer pretty damn quick. So isPrime[3] == true and isPrime[9] == false.

 
 
0
 
vote

En el código hay Z2 cláusulas que son innecesarias. El Z3 Declaraciones sobre ellos Z4 .

 

In the code there are else clauses that are unnecessary. The if statements above them return.

 
 
 
 

Relacionados problema

1  Reto de primos consecutivos en Codeeeval.com  ( Consecutive primes challenge at codeeval com ) 
Estoy trabajando a través de un nuevo desafío en Codeeeval.com y creo que estoy obteniendo un resultado correcto, pero no puedo pasar por su alumnador. No est...

5  Encuentre el próximo número Prime - Control de flujo de los bucles anidados 'para `  ( Find the next prime number flow control of nested for loops ) 
Este código funciona perfectamente, pero me molesta. Tener un bucle etiquetado y anidado Bucle, con un Enumerable<T>.Empty()0 Declaración, y un 9988777665...

9  Factorización de números rápidos en Python  ( Fast number factorization in python ) 
Aquí está mi implementación para factorizar un entero positivo: require File.expand_path(File.dirname(__FILE__) + '/edgecase') # Project: Create a Proxy C...

5  Proyecto EULER # 3 IN C # - Factor principal más grande  ( Project euler 3 in c largest prime factor ) 
Acabo de empezar a hacer los desafíos de Project Euler y en este momento estoy en el desafío # 3: el factor primordial más grande del 600851475143. Escrib...

2  Imprimiendo todos los números primeros entre dos límites  ( Printing all the prime numbers between two bounds ) 
Sigo recibiendo un límite de tiempo excedido para esta solución a SPOJ PRIME1 . Necesito imprimir todos los números primos dentro de un intervalo dado (con i...

2  Números primos menos que un número dado n  ( Prime numbers less than a given number n ) 
Entonces, empecé este desafío en Codeeeval , que solicita imprimir el número de números primos menos que cualquier entero dado N, donde 0 & lt; N & lt; 4,294...

5  La suma de primos toma para siempre  ( Summation of primes takes forever ) 
Project Euler Problema 10 Pregunta: "¿Cuál es la suma de todos los números primeros por debajo de 2 millones?" ¿Cómo aceleré mi código? Está tomando para ...

1  Encuentra el Kth Prime y todos los primos debajo de él  ( Find the kth prime and all the primes below it ) 
Funciona al encontrar 2N + 1 con N de 1 a K, pero no donde 2N + 1 sería divisible por uno de los primos ya conocidos. Me gustaría saber si el programa puede e...

3  Análisis de simetría para arreglos atómicos en un cristal  ( Symmetry analysis for atom arrangements in a crystal ) 
Por un tiempo ahora he tenido la intención de publicar un poco de mi código Haskell aquí para que alguien pueda decirme qué partes de la biblioteca de idiomas...

4  Encontrar y probar la primalidad  ( Finding and testing primality ) 
He escrito una clase que es responsable de ambos primos enumerantes y probando la primalidad de un número. Aquí está el código: public static class Prime...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos