elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 132
51  Programación / Programación C/C++ / Re: Resultado distintos en diferentes compiladores en: 11 Agosto 2014, 22:38 pm
Tienes un problema con eso de empezar los for desde "1" ya que las posiciones del arrray van desde cero hasta TAM-1 de forma que el listado[4] = 12 se "sale" del tamaño del array que va de 0 a 3.

Vamos que sería:

Código
  1. ************************************
  2.  
  3. listado[0] = 11;
  4. listado[1] = 13;
  5. listado[2] = 53;
  6. listado[3] = 12;
  7.  
  8. ********************************************
  9.  
  10.        for(int x = 0; x < TAM; x++)
  11.          for(int s = 0; s < TAM-1; s++){
  12.  
  13. ********************************************
  14.  
  15. for(int g = 0; g < TAM; g++)
  16.  
  17. ********************************************
  18. }
  19.  

¡¡¡¡ Saluditos! ..... !!!!


52  Programación / Programación C/C++ / Re: [Aporte] Detector de números primos en C++ en: 11 Agosto 2014, 21:03 pm
leosansan tu programa no imprime la cantidad de primos requerida al ingresar 100 solo procesa 25 que son los que podemos encontrar entre 1 y 100 por eso es evidente la diferencia de velocidades sobre las soluciones anteriores

Es que en todos los códigos que comparé calculé los primos "hasta" N.

Aquí una salida para que lo veas:

Código
  1. Numero de primos a conseguir HASTA ( i >= N / 2 ) : 100
  2. 5  7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71  73  79  83
  3.  89  97
  4.        Conseguidos 25 primos en 0.01 segundos.
  5.  
  6. Numero de primos a conseguir HASTA ( i >= N / 2 ) : 1000
  7. 5  7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71  73  79  83
  8.  89  97  101  103  107  109  113  127  131  137  139  149  151  157  163  167
  9. 173  179  181  191  193  197  199  211  223  227  229  233  239  241  251  257
  10. 263  269  271  277  281  283  293  307  311  313  317  331  337  347  349  353
  11. 359  367  373  379  383  389  397  401  409  419  421  431  433  439  443  449
  12. 457  461  463  467  479  487  491  499  503  509  521  523  541  547  557  563
  13. 569  571  577  587  593  599  601  607  613  617  619  631  641  643  647  653
  14. 659  661  673  677  683  691  701  709  719  727  733  739  743  751  757  761
  15. 769  773  787  797  809  811  821  823  827  829  839  853  857  859  863  877
  16. 881  883  887  907  911  919  929  937  941  947  953  967  971  977  983  991
  17. 997
  18.        Conseguidos 168 primos en 0.063 segundos.
  19.  
  20.  

Como ves calcula los primos "hasta" n. Ya comenté al principio que había modificado el código inicial que si que calcula los "n" números primos. Me faltó corregir el código y poner:

Código
  1. cout << "Numero de primos a conseguir HASTA".........

Espero que ahora esté claro, siento no haber puesto el "HASTA" en el código. Ya edité el mensaje anterior y corregí ese detalle.

¡¡¡¡ Saluditos! ..... !!!!


53  Programación / Programación C/C++ / Re:[Aporte] Detector de números primos en C++ en: 11 Agosto 2014, 15:13 pm
Con 100, significa 100 primos eh?

¡Ah!, menuda pifia la mia,  :laugh:

Por cierto en el código de factorizar se te ha escapado un "=" , no estaba en:

Código
  1. for(;i<=sq;)

Sin el igual factoriza 100 como:

Código
  1.  
  2. Pon el numero a factorizar: 100
  3.  
  4. Numero a factorizar: 100
  5. 1 2 2 25
  6. Acabado.
  7.  
  8.  

Y con el igual:

Código
  1.  
  2. Pon el numero a factorizar: 100
  3.  
  4. Numero a factorizar: 100
  5. 1 2 2 5 5
  6. Acabado.
  7.  
  8.  

Estoy al loro, ¿eh?.  :laugh:

¡¡¡¡ Saluditos! ..... !!!!






EDITO:




    Seguro que lo has hecho a bote pronto ya que si lo piensas un poco el for que propones:

Código
  1. uint64_t sq = sqrt(hh);
  2.        for(;i<=sq;){
  3.            if(hh%i==0)
  4.                if(hh==i){
  5.                    break;
  6.                }else{
  7.                    hh=hh/i;
  8.                    sq = sqrt(hh);
  9.                    cout << i << " ";
  10.                }
  11.            else
  12.                if(dos){
  13.                    dos=false;
  14.                    ++i;
  15.                }else
  16.                    i+=2;
  17.        }

se puede reducir a tan sólo una línea:  :o

Código
  1. while ( i < hh )
  2.  ( hh % i == 0 ) ? cout << i << " "  , hh /=  i : i = ( i == 2 ) ? i + 1 :i + 2 ;

sin necesidad de usar la variable "dos" ni "sqrt".  :rolleyes:

Aquí es donde hecho de menos lo que has llamado "Concursillo" donde se plantee un problema y en sucesivas réplicas y/o contra réplicas podamos ir "puliendo" un código.

54  Programación / Programación C/C++ / Re: [Aporte] Detector de números primos en C++ en: 11 Agosto 2014, 15:00 pm
A mi me funciona perfecto el detector. Ahora mismo va por el millardo, y casi una GB de txt xD
Estoy planeando pasar de ascii a binario en archivo.

Pues a mi la primera vez, es decir cuando aún no existe el fichero primos, sí que funciona, pero la segunda vez se "queda clavado".

E insisto, y perdón por ello, al introducir 100 me escribe en el fichero hasta el 547.  :o

A ver si alguien más se anima a comprobarlo.

¡¡¡¡ Saluditos! ..... !!!!



55  Programación / Programación C/C++ / Re: [Aporte] Detector de números primos en C++ en: 11 Agosto 2014, 14:37 pm
Respecto del código de los números primos se te pasó actualizar los include:

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <ctime>
  4. #include <cmath>
  5. #include <cstdlib>

Pero no sé que pasa que después de introducir el número el programa se que en standby, supongo que por algún bucle. ¿No te pasa a ti?. Me pasa en Code::Blocks, no así en DeV-C++ donde si que funciona.  :-[

Pues no, funciono una vez pero la segunda se queda también en standby, Me da que al escribir el fichero la primera vez va O.K pero al darle por segunda vez no va, vamos es como si no pudiera sobreescribir. Además al introducir n = 100 me escribe hasta el 547  :-\

Un fuerte saludo y gracias por los aportes.

Por cierto, no abandones la idea del "concursillo", parecía interesante.


56  Programación / Programación C/C++ / Re: [Aporte] Detector de números primos en C++ en: 11 Agosto 2014, 07:57 am
Holas :D

Aquí dejo un código, más que nada curioso, que va guardando números primos en un archivo.

Información:
  • Tras cerrar el programa, retoma el último primo que generó
  • Funcionalidad para medir el tiempo que tarda (véase que con números altos empieza a tardar mucho más)
  • Se usa sólo la librería estándar

Bueno, espero que a alguien le ayude.


Espero que no te moleste que modifique un poco el código para hacer uso del mismo en una comparativa entre distintos métodos y/o variantes para calcular los primos entre 1 y 10^2, 10^3, ......10^9.

El código que he usado para calcular los primos por el métode de "i*i=>n" e "i>=n/2" es:

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <ctime>
  4.  
  5. using namespace std ;
  6.  
  7. inline bool primo ( uint64_t n ) {
  8.    uint64_t i = 3 ;
  9.    for ( ; n % i != 0 ; i += 2 )
  10.        if ( i /** i >= n i*/ >= n / 2  )
  11.            return true ;
  12.    return false ;
  13. }
  14.  
  15. int main ( ) {
  16.    while ( true ) {
  17.        uint64_t u = 1 , g = 0 , h = 0 ;
  18.        clock_t t ;
  19.        cout << "Numero de primos a conseguir HASTA " /*<< "( i * i >= N ) : " */<< "( i >= N / 2 ) : "  ;
  20.        cin >> g ;
  21.        t = clock ( ) ;
  22.        while ( (u += 2) < g )
  23.            if ( primo ( u ) )
  24.                h++ ;
  25.        t = clock ( ) - t ;
  26.        cout << endl << "\tConseguidos " << h + 2 << " primos en " << ( ( float ) t ) / CLOCKS_PER_SEC << " segundos." << endl << endl ;
  27.    }
  28. }

Como se puede observar he eliminado el tema de guardar en fichero para calcular  tan sólo el tiempo para obtener los números primos.

Y estos son los resultados, en mi modesto ordenador, claro ( pongo el caso de "i*i>=N" y de "i>=N2" ya que son los que me interesan para  comparar  los resultados con el método del array primos:



Código
  1. Numero de primos a conseguir HASTA ( i >= N / 2 ) : 100
  2.  
  3.        Conseguidos 25 primos en 0 segundos.
  4.  
  5. Numero de primos a conseguir HASTA ( i >= N / 2 ) : 1000
  6.  
  7.        Conseguidos 168 primos en 0.001 segundos.
  8.  
  9. Numero de primos a conseguir HASTA ( i >= N / 2 ) : 10000
  10.  
  11.        Conseguidos 1229 primos en 0.038 segundos.
  12.  
  13. Numero de primos a conseguir HASTA ( i >= N / 2 ) : 100000
  14.  
  15.        Conseguidos 9592 primos en 2.887 segundos.
  16.  
  17. Numero de primos a conseguir HASTA ( i >= N / 2 ) : 1000000
  18.  
  19.        Conseguidos 78498 primos en 242.673 segundos.
  20.  
  21.  




Código
  1. Numero de primos a conseguir HASTA  ( i * i >= N ) : 100
  2.  
  3.  Conseguidos 25 primos en 0 segundos.
  4.  
  5. Numero de primos a conseguir HASTA ( i * i >= N ) : 1000
  6.  
  7.  Conseguidos 168 primos en 0 segundos.
  8.  
  9. Numero de primos a conseguir HASTA ( i * i >= N ) : 10000
  10.  
  11.  Conseguidos 1229 primos en 0.002 segundos.
  12.  
  13. Numero de primos a conseguir HASTA ( i * i >= N ) : 100000
  14.  
  15.  Conseguidos 9592 primos en 0.051 segundos.
  16.  
  17. Numero de primos a conseguir HASTA  ( i * i >= N ) : 1000000
  18.  
  19.  Conseguidos 78498 primos en 0.904 segundos.
  20.  
  21. Numero de primos a conseguir HASTA  ( i * i >= N ) : 10000000
  22.  
  23.  Conseguidos 664579 primos en 25.575 segundos.
  24.  
  25. Numero de primos a conseguir HASTA (  i * i >= N N ) : 100000000
  26.  
  27.  Conseguidos 5761455 primos en 696.361 segundos.
  28.  
  29.  



Como puede apreciarse hay una sutil ventaja del "i*i>=n" frente al "i>=n/2", hasta tal punto que para éste último no he tenido paciencia en ver en qué tiempo calcula los primos hasta 10^7.  Observar la enorme diferencia en el cálculo de los primos hasta 10^7, no te cuento si se introducen valores mayores. ;)

Pero a lo que realmente iba era a comparar los métodos anteriores con una variante consistente en ir guardando los primos calculados en cada iteración. Como ya comenté en otro hilo este método presenta la ventaja que al usar los primos calculados se evita el probar todos los impares como posibles divisores de un número, tan sólo tiene que comparar con los primos que, evidentemente, son menos que los impares . Y como un resultado vale más que mil palabras paso a poner el código que he usado y el resultado obtenido:



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <stdbool.h>
  5.  
  6. int main ( ) {
  7.  int i = 0, n , k = 0 , x = 0 , N , lineas = 0 , N_PRIMS ;
  8.  int potencias [ ] = { 5 , 10 , 100 , 1000 , 10000 , 100000 , 1000000 , 10000000 , 100000000 , 1000000000 } ;
  9.  int Relacion, relacion [ ] = { 1 , 2 , 4 , 5 , 8 , 10 , 12 , 15 , 17 , 19 } ;
  10.  char cifra [ 10 ] , cad1 [ ] = "%" , cad2 [] = "d" ;
  11.  clock_t t ;
  12.  while ( 1 ) {
  13.    bool aux = false ;
  14.    x = k = lineas = 0 ;
  15.    printf ( "\n\nNumero de primos a conseguir HASTA : " ) ;
  16.    scanf ( "%d" , &N ) ;
  17.  
  18.    for ( i = 0; i < 10; i++ )
  19.      if ( N / potencias[i] >= 1 && N / potencias[i] < 10 ){
  20.        Relacion = relacion [ i ] ;
  21.        break ;
  22.      }
  23.    N_PRIMS = ( N / Relacion ) ;
  24.    int *primos = calloc( N_PRIMS , sizeof ( unsigned int ) ) ;
  25.    if ( !primos ) {
  26.      printf ( "primos::No hay espacio suficiente en memoria" ) ;
  27.      return EXIT_FAILURE ;
  28.    }
  29.    primos [ x++ ] = 2 ;
  30.    primos [ x ] = 3 ;
  31.    t = clock ( ) ;
  32.    for ( n = 5 ; n <= N ; n += 2 ) {
  33.      aux = false ;
  34.      k = 1 ;
  35.      for ( primos [ k ] ; primos [ k ] * primos [ k ] <= n ; k++ )
  36.        if ( n % primos[k] == 0 ) {
  37.          aux = true ;
  38.          break ;
  39.        }
  40.      if ( !aux  )
  41.        primos [ ++x ] = n ;
  42.    }
  43.    t = clock() - t ;
  44.    printf ( "\n\t\t\tEl ultimo es: %d \n\n" , primos [ x ] );
  45.    printf ( "Conseguidos los %d primos en %f segundos.\n\n" , x + 1, ( ( float ) t ) / CLOCKS_PER_SEC ) ;
  46.  
  47.         /***** PARA IMPRIMIR POR GRUPOS *****/
  48.  
  49.  /** quita el "+" que aparece al final de la siguiente linea  **/
  50.  
  51.  /*******************************+/
  52.     int l = 1 , n1 = N ;
  53.     for(  ;  n1 ; l ++, n1 /= 10 ) ;
  54.     sprintf ( cifra , "%s%d%s" , cad1 , --l , cad2) ;
  55.     for( n = 0 , i = 1 ; n <= x ; n ++ , i ++ ) {
  56.       if( 90 / i == l )
  57.         putchar ( '\n' ) , i = 1 , lineas++ ;
  58.       if( lineas == 38 )
  59.         system ( "pause" ) , lineas = 0 ;
  60.       printf( cifra , primos [ n ] ) ;
  61.     }
  62.   /********************************/
  63.    free ( primos ) ;
  64.  }
  65.  return EXIT_SUCCESS ;
  66. }



Código
  1. Numero de primos a conseguir HASTA : 100
  2.  
  3.                        El ultimo es: 97
  4.  
  5. Conseguidos los 25 primos en 0.000000 segundos.
  6.  
  7.  
  8.  
  9. Numero de primos a conseguir HASTA: 1000
  10.  
  11.                        El ultimo es: 997
  12.  
  13. Conseguidos los 168 primos en 0.000000 segundos.
  14.  
  15.  
  16.  
  17. Numero de primos a conseguir HASTA: 10000
  18.  
  19.                        El ultimo es: 9973
  20.  
  21. Conseguidos los 1229 primos en 0.000000 segundos.
  22.  
  23.  
  24.  
  25. Numero de primos a conseguir HASTA: 100000
  26.  
  27.                        El ultimo es: 99991
  28.  
  29. Conseguidos los 9592 primos en 0.015000 segundos.
  30.  
  31.  
  32.  
  33. Numero de primos a conseguir HASTA: 1000000
  34.  
  35.                        El ultimo es: 999983
  36.  
  37. Conseguidos los 78498 primos en 0.151000 segundos.
  38.  
  39.  
  40.  
  41. Numero de primos a conseguir HASTA: 10000000
  42.  
  43.                        El ultimo es: 9999991
  44.  
  45. Conseguidos los 664579 primos en 3.721000 segundos.
  46.  
  47.  
  48.  
  49. Numero de primos a conseguir HASTA: 100000000
  50.  
  51.                        El ultimo es: 99999989
  52.  
  53. Conseguidos los 5761455 primos en 81.288000 segundos.
  54.  
  55.  



Creo que la "bondad=rapidez=eficiencia" de este método con respecto a los dos anteriores es más que evidente, basta observar el resultado para 10^8 de "696.361" segundos con el método de "i*i" frente a los "81.288000 " del método de los primos, así como los "25.575" de "i*i" frente a los escasos "3.721000" del método de los primos y la diferencia aumenta a medida que crecen el valor de "n".

Me permito una pequeña aclaración. En el último método he tenido que hacer "virguerías" con la memoria para alcanzar los valores de hasta 10^9. En realidad es sólo un parche ya que lo que procede es no guardar los primos en un array sino en un fichero, tal como propuso inicialmente ivancea96, pero como quería comparar los métodos mencionados no quería que la comparativa se viese afectada por el hecho de leer, guardar, leer en un fichero. No obstante dejo caer el que alguien se interese en implementar esa opción y la comparta con nosotros.  ;)

Pero aquí no se acaban las opciones. Existen otras, en concreto me referiré a la llamada "Criba de Erastótenes", en la cual no se hace uso de la operación módulo lo que redunda en unos tiempos espectaculares respecto a los anteriores. Pongo algunos resultados con los anteriores métodos para que saquéis vuestras propias conclusiones:



Código
  1. Numero de primos a conseguir HASTA: 100
  2.  
  3.                        El ultimo es: 97
  4.  
  5. Conseguidos los 25 primos en 0.000000 segundos.
  6.  
  7.  
  8. Numero de primos a conseguir HASTA: 1000
  9.  
  10.                        El ultimo es: 997
  11.  
  12. Conseguidos los 168 primos en 0.000000 segundos.
  13.  
  14.  
  15. Numero de primos a conseguir HASTA: 10000
  16.  
  17.                        El ultimo es: 9973
  18.  
  19. Conseguidos los 1229 primos en 0.000000 segundos.
  20.  
  21.  
  22. Numero de primos a conseguir HASTA: 100000
  23.  
  24.                        El ultimo es: 99991
  25.  
  26. Conseguidos los 9592 primos en 0.001000 segundos.
  27.  
  28.  
  29. Numero de primos a conseguir HASTA: 1000000
  30.  
  31.                        El ultimo es: 999983
  32.  
  33. Conseguidos los 78498 primos en 0.018000 segundos.
  34.  
  35.  
  36. Numero de primos a conseguir HASTA: 10000000
  37.  
  38.                        El ultimo es: 9999991
  39.  
  40. Conseguidos los 664579 primos en 0.181000 segundos.
  41.  
  42.  
  43. Numero de primos a conseguir HASTA: 100000000
  44.  
  45.                        El ultimo es: 99999989
  46.  
  47. Conseguidos los 5761455 primos en 2.217000 segundos.
  48.  
  49.  
  50. Numero de primos a conseguir HASTA: 1000000000
  51.  
  52.                        El ultimo es: 999999937
  53.  
  54. Conseguidos los 50847534 primos en 25.367000 segundos.
  55.  
  56.  



Ahora para 10^8 se pasa de los "696.361" segundos del "i*i" a los dos escasos segundos, "1.817000" del método de la Criba.  ;)

Destaco que estos métodos son "caseros", es decir sin usar métodos matemáticos avanzados.

Espero que con lo anteriormente expuesto haya aclarado dudas que les surgió a algunos en otro hilo de primos.

Y ya "tá", un fuerte saludo para todos y sean benévolos con los posibles errores si los hubiera, todo ha sido con la mejor de las intenciones.






EDITADO con "HASTA" en la impresión, para que no queden dudas.
57  Programación / Programación C/C++ / Re: Problema simple con programa números primos en: 11 Agosto 2014, 06:34 am
no entendí lo que no estaba claro D: pero extiendo
.............................................................

Está claro que no me exprese bien, sorry!!!.

Yo no hablaba del caso de comprobar si "un" número concreto es o no primo sino de calcular  los números primos en un intervalo, como de 1  10^8, por ejemplo. Está claro que si sólo es un número es casi impepinable usar el método del módulo, y aún así se pueden introducir mejoras.

En cuanto al número de operaciones es al menos menor ya que lo único que se hace es sustituir la operación de "i*i<N" por "primos[ i ]*primos[ i ]<N". El motivo de que sea menor es que en el método del "i*i" se usan todos los impares desde 3 a la raíz del número en el peor de los casos, como en el caso de querer comprobar si 99991 es o no primo, sin embargo en el método del array sólo se usan los primos previamente  calculados que obviamente son menores que los impares. La única penalización es el uso de un array y que tampoco ya que lo que procede realmente es ir guardando los primos calculados en en fichero y escribir y leer los cuando proceda. Como ves, se consigue disminuir el número de operaciones módulo en unos cuantos miles, todo lo cual redunda en una mejora, al menos sobre el papel.

No obstante, y para que no digan que hago tareas, será en este otro hilo, cortesía de ivancea96 aporte_detector_de_numeros_primos_en_c donde podrás encontrar una comparativa de los métodos y donde se pone de manifiesto la bondad del método del uso de "primos" frente al "i*i"

Espero que ahora esté más claro.



Un fuerte saludo de León amigo engel lex.


58  Programación / Programación C/C++ / Re: Pregunta sobre instrucciones de repetición en: 11 Agosto 2014, 06:10 am
...................................................
 Buscando encontré que la instrucción de repetición for es usada para repetición por contador, mientras while es usada para repetición controlada por centinela. ¿Por qué es así?

 Las instrucciones de repetición do...while para que es requerida? se para que sirve, pero no se para qué casos tiene un uso especial
..................................................

Dicho a lo breve:

* for: Cuando voy a realizar un número de iteraciones conocido de antemano. Caso típico  de su uso en el caso en que se pide al usuario ingresar 10 números. No obstante siempre se puede salir antes del bucle con "break", "return" o similar caso de que proceda, pero no es lo usual ya que en ese caso lo más lógico sería haber usado un while.

* while: Bucle a usar cuando no tiene por qué conocerse previamente el número de iteraciones, aunque también podría usarse en este caso el for con una salida del mismo con un break, return y/o bandera o flag. En cambio ahora lo que se conoce es una "condición" que se ha de cumplir para terminar el bucle. Caso típico en que el usuario ha de introducir datos hasta que entre un valor particular, en cuyo caso se sale del bucle.

* do-while: Básicamente es como el while sólo que sabemos de antemano que se va a producir una iteración al menos.

Esto a lo simple. Te aconsejaría un buen libro para ampliar conocimientos.   ;)

¡¡¡¡ Saluditos! ..... !!!!


59  Programación / Programación C/C++ / Re: Devolver el menor de un array en: 10 Agosto 2014, 15:30 pm
El programa me compila perfectamente, pero al introducirle los números se para no hace nada y no encuentro el error, podrían ayudarme por favor:(
............................

En realidad si que hace, pero no termina. En el while, que por cierto está de más, no varías el valor de i con lo que el while provoca un  bucle infinito, tendrías que poner al final del mismo algo como i++.

Pero lo correcto es cambiar un poco esa función "minimo". Además de lo ya mencionado de que sobra el while, conviene pasarle como parámetro el valor de la variable nu ya que tal como lo tienes con MAX, y si has introducido un número de valores inferior al mismo, se estaría tomando posiciones de memoria no definidas con el consiguiente riesgo de que contengan basura y distorsione el valor calculado del mínimo. Y el valor de nu=' ' sobraría al pasar como argumento su valor.

Aunque se puede abreviar, la función "minimo" puede ser algo como:

Código
  1. int minimo ( nument Array , int nu) {
  2. int minimo = Array [ 0 ] ;
  3. for ( int i = 1 ; i < nu ; i++ )
  4.    if ( Array [ i ] <= minimo )
  5.      minimo = Array [ i ] ;
  6. return minimo ;
  7. }

¡¡¡¡ Saluditos! ..... !!!!



EDITADO.
60  Programación / Programación C/C++ / Re: Problema simple con programa números primos en: 10 Agosto 2014, 09:13 am

entonces ejemplo, para saber si 211 (raíz ~14.5) es primo solo basta con probar 2, 3, 5, 7, 9, 11, 13 según tu algoritmo y solo probarías 7 factores en lugar de 211 dándole mucha velocidad...

y por lo menos 3.123.133 en lugar de probar más de 1 millón de factores, solo pruebas unos 884 factores y listo...

Eso último no está nada claro, si el número es 1 millón habría que probar según tu propuesta hasta num*num = 1000 000 , es decir de 3 a num=999 (1000).

Pero aún así se estaría trabajando en balde ya que probaríamos, entre otros, 15, 25, 27, 33, 35, 45, 49, ......que sería una redundancia ya que si  es divisible entre 3 y 5 el probar con 15 está de más y así sucesivamente.

Es decir, tan sólo hay que probar con divisores que, además de ser impares, sean primos, es decir:

3 , 5 , 7, 11 , 13 , 15 , 17 , 19 , 21 , 23 , 25 , 27  , 29 ,31 ,   33  ,   35 , 37 , 39 , 41 , 43 , 45 , 47 ,   49 ......

En el caso de 1000 000 hasta num = 1000 ( 1000*1000=1000000) hay en principio que tomar los impares, que son 500. Pero de ellos tan sólo hay 168 primos con lo que ya reducimos considerablemente el número de probaturas.

Y en el caso de 100 000 0000 hay ¡¡¡ "50 000 000" ¡¡¡ de impares pero tan solo 5 761 455 primos, con lo que ahorramos las pruebas en un factor de casi 20.

Por lo que de una forma simple se pueden ir guardando los primos obtenidos en un array, "primos", e ir probando sólo a estos en lugar de todos los impares, algo como:

Código
  1.  for ( primos[k] ; prims[k] * primos[k] <= n ; k++ ) {
  2.      if ( n % primos[k] == 0 )

¡¡¡¡ Saluditos! ..... !!!!


Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 132
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines