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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Mejorar el codigo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mejorar el codigo  (Leído 3,790 veces)
AprendiendoAProgramar

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Mejorar el codigo
« en: 19 Diciembre 2017, 23:45 pm »

Buenas.

Desarrolle un código para que me salieran los numeros primos de 1-100, aunque lo logré creo que mi código se puede mejorar mucho más para simplificarlo, ¿alguien podría ayudarme?
Código
  1. #include<iostream>
  2. #include<conio.h>
  3.  
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8.  
  9.    int contador,aux=1;
  10.  
  11.    for(int i=1;i<=100;i++){
  12.        contador=0;
  13.        aux=1;
  14.        while(aux<=i){
  15.  
  16.            if(i%aux==0){
  17.                contador++;
  18.            }
  19.            aux++;
  20.  
  21.        }
  22.        if(contador==2){
  23.            cout<<i<<endl;
  24.        }
  25.        if(i==1)cout<<"1"<<endl;
  26.  
  27. }
  28.  
  29.    getch();
  30.    return 0;
  31. }
  32.  


En línea

APENAS EMPIEZO CON ESTO DE LA PROGRAMACIÓN Y CUANDO APARECEN ERRORES ES ALGO COMO........



(ES SOLO HUMOR)
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Mejorar el codigo
« Respuesta #1 en: 20 Diciembre 2017, 01:23 am »

2 detalles sobre los numeros primos

1- nunca un par es primo, si no evaluas pares te ahorras el 50% del proceso
2- el minimo multiplo de un numero nunca es mayor que su raíz, es decir, si desglosamos 100

Código:
1    2   4   5   10
100  50  25  20  10

el punto de confluencia siempre será su raiz, ya desde allí es la misma cuenta invertida, con esto et vas a ahorrar un monton de ciclos, por ejemplo para saber si 1.000.001 es primo solo es necesario probar hasta 1.000, así que son 1.000 ciclos (en este caso solo el 0.1% del trabajo y por ser raíz la eficiencia aumenta con lo grande del numero)... sin embargo calcular la raiz cuadrada es una operacion pesada y debemos velar que esto no consuma el proceso que nos ahorramos, así que lo calculamos en inversión...

por esto antes de hacer un programa es importante investigar todas las teorías y temas asociados...

estos 2 consejos son basicos... con esto para los primos de 1.000.001 solo necesitas 0.05% del trabajo que haría tu código

si metemos allí los multiplos de 3 nos reducimos 15% más y el codigo queda algo como


Código
  1. //nunca haremos primos de negativos y podemos evaluar  primos hasta de 64bit
  2. bool es_primo(long unsigned int num){
  3.  
  4.  if(num <= 3){
  5.    return >=2; //1 no es primo
  6.  }
  7.  
  8.  long unsigned int mult;
  9.  
  10.  //si mult es la raiz, mult*mult debe ser el numero
  11.  for(mult = 5;mult*mult < num; mult += 6){ //+=6 porque 6 es multiplo de 3 y 2
  12.    if(num % mult == 0) {
  13.      return false; // no es primo
  14.    }
  15.    if(num+2 % mult == 0) {
  16.      return false; // no es primo
  17.    }
  18.  }
  19.  return false; // llegados a este punto debe ser primo
  20. }

lo hice de mente, espero no tenga errores


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Mejorar el codigo
« Respuesta #2 en: 20 Diciembre 2017, 18:26 pm »

Yo no lo haría de forma ligeramente diferente a como lo resuelve engel lex

Básicamente sabemos que solo tiene posibilidades de ser primo si acaba en 1,3,7 ó 9, luego esa debería ser la primera condición a verificar.
Luego, en efecto basta con llegar a la raíz cuadrada del número más alto, ya que a*b = b*a, con lo que al llegar al punto donde 'a' sea la raíz cuadrada, luego los valores de 'a', irán tomando los de 'b' y viceversa...



Código:
buleano = funcion EsPrimo(entero Valor)
     entero unidades, max, k

    unidades = (valor modulo 10)

    Si ((unidades and 1) = 1) luego  // primer filtro  (eliminamos los acabados en 0,2,4,6 y 8, es decir aceptamos solo los impares
        Si (unidades = 5) luego   // y ahora descartamos el impar 5
            Si (valor=5) luego
                Devolver TRUE
            Sino
                Devolver FALSE  // cualquier otro múltiplo de 5 no es primo.
            Fin si
        Sino
            max = RaizCuadrada(valor) +1  // segundo filtro,
            bucle para k desde 7 hasta max en incrementos de 2
                  Si ((valor modulo k) = 0) Devolver FALSE
            Fin bucle

            Devolver TRUE
        Fin si
    Sino  // todavía podría ser 2 que es el único par que es primo (divisible sólo: por sí mismo y la unidad)
        Si (valor = 2) luego
            Devolver TRUE
        Sino
            Devolver FALSE
        Fin si
    Fin si
Fin funcion
Este código es óptimo para saber si un número cualquiera (aleatorio) es primo, pero si vas a operar con una lista seguida de valores, puede ser optimizada, toda vez que determinadas comprobaciones pueden moverse al bucle principal de la lista, evitando la llamada a esta función.

Aparte de eso, el bucle puede mejorarse toda vez que sabemos que si acaba en 5, no será primo, y también porque muchos impares son múltiplos de 3 (esto es cada 3 impares seguidos, 1 es múltiplo de 3): 11,13->15;  17,19->21; 23,25->27; 29,31->33 . 

Queda a tu esfuerzo optimizar dichos casos...
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Mejorar el codigo
« Respuesta #3 en: 20 Diciembre 2017, 20:14 pm »

Para aligerar aún más las cosas (a expensas de usar más memoria) te diría que fueras guardando los primos encontrados en una lista dinámica y usaras los elementos de esa lista como divisores del número que estás operando. Si llegas al final de ella ( o superas la raíz cuadrada del número), sin que ningún elemento haya sido divisible por el número, has encontrado el siguiente primo y lo incluyes en la cola de la lista. Así te evitas de realizar muchas operaciones.

La razón de esto es que cuando factorizas, si te das cuenta, usas siempre el menor primo.
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Mejorar el codigo
« Respuesta #4 en: 21 Diciembre 2017, 04:02 am »

Otra manera de optimizar esta logica es modificando el ciclo propuesto que parte en 7 y que va de 2 en 2, haciaendo que sume 4 y luego sume 2 (alternadamente), saltandose posibles factores que se sabe no son primos.

7, (+4=) 11, (+2=) 13, (+4=) 17, (+2=) 19, (+4=) 23, (+2=) 25, (+4=) 29, (+2=) 31, ...
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Mejorar el codigo
« Respuesta #5 en: 21 Diciembre 2017, 05:13 am »

Otra manera de optimizar esta logica es modificando el ciclo propuesto que parte en 7 y que va de 2 en 2, haciaendo que sume 4 y luego sume 2 (alternadamente), saltandose posibles factores que se sabe no son primos.

7, (+4=) 11, (+2=) 13, (+4=) 17, (+2=) 19, (+4=) 23, (+2=) 25, (+4=) 29, (+2=) 31, ...


justamente esto hago ;)

de cabeza evalúa 2 y 3, de allí en más empieza en 5 y evalúa x y x+2, luego avanza 6 es decir va algo como 5;7, 11;13, 17;19, 23;25, 29;31, 37;43
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
mejorar codigo java
Java
sapito169 5 7,293 Último mensaje 18 Diciembre 2008, 05:37 am
por sapito169
mejorar codigo
Java
winnipu 2 3,515 Último mensaje 2 Enero 2015, 16:04 pm
por winnipu
Mejorar este código
.NET (C#, VB.NET, ASP)
Meta 1 2,310 Último mensaje 12 Diciembre 2015, 21:56 pm
por kub0x
Mejorar el código de emails
PHP
Antoniio 0 2,083 Último mensaje 12 Octubre 2016, 01:16 am
por Antoniio
Mejorar la apariencia del código
Sugerencias y dudas sobre el Foro
Borito30 1 3,009 Último mensaje 20 Febrero 2017, 18:41 pm
por #!drvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines