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


 


Tema destacado: Análisis del vídeo del hackeo al Sindicato de los Mossos de Esquadra


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Que puedo hacer para mejorar mi logica de programacion??
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Que puedo hacer para mejorar mi logica de programacion??  (Leído 409 veces)
AndresEnriquezV

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Que puedo hacer para mejorar mi logica de programacion??
« en: 13 Agosto 2017, 18:09 »

algun consejo que me puedan dar ? por que se me hace un poco complicado resolver ciertas cosas muchas gracias ;-) ;-)


« Última modificación: 13 Agosto 2017, 19:03 por AndresEnriquezV » En línea

engel lex
CoAdmin
***
Desconectado Desconectado

Mensajes: 13.024



Ver Perfil
Re: Que puedo hacer para mejorar mi logica de programacion??
« Respuesta #1 en: 13 Agosto 2017, 19:57 »

esto es igual que entrenar cualquier parte de tu cuerpo... buscar ejercicios y hacerlos... tambien investigar como otros lo hacen y ver si tu puedes hacerlo mejor...

por lo menos un punto claro para mucha gente es cuando resuelven especialmente el problema de buscar numeros primos... supongamos saber si 100.000.007 es primo

mucha gente haría
Código
  1. bool es_primo(int numero){
  2. int i;
  3.  
  4. for(i = 2; i < numero; i++){// desde 2 hasta numero -1
  5.  if(numero%i == 0){// si i es divisor de numero
  6.   return false; // no es primo
  7.  }
  8. }
  9. return true; // si no hay divisores es primo
  10. }

para saber si es primo hubieras hecho 100.000.007 operaciones eso tomará unos segundos incluso en un buen procesador

pero si calculas (o investigas en wikipedia) te darás cuenta que el mayor numero posible divisor, de un numero es su raíz cuadrada... así que podemos hacer el ciclo mucho más corto

Código
  1. for(i = 2; i <= sqrt(numero); i++)

aquí solo harás 10.000 operaciones (wow el numero decreció muchisimo)

pero bien te dirá cualquier libro y sistema que evites usar sqrt a menos que sea necesario,porque es una operación lenta y pesada... entonces, como sacar la raíz de un numero sin sacar la raíz?... elevandolo, un cuadrado es un operación simple

Código
  1. for(i = 2; i*i <= numero; i++)

las mismas 10.000 operaciones, pero ahora será más rapido!

sin embargo... aún comparas todos los numeros pares como 4, 6, 8.... sabemos que si es multiplo de esos, era multiplo de 2... así que podríamos solo probar impares agregando una condicion inicial

Código
  1. bool es_primo(int numero){
  2. int i;
  3.  
  4. for(i = 3; i*i <= numero; i+=2){// desde 2 hasta raíz del numero
  5.  if(numero%2==0){//si es par
  6.   return false;// no es primo
  7.  }
  8.  if(numero%i == 0){// si i es divisor de numero
  9.   return false; // no es primo
  10.  }
  11. }
  12. return true; // si no hay divisores es primo
  13. }

aquí si es par, ni si quiera pasa por el ciclo... resolviendo para los pares instantaneamente y ahora para llegar a nuestro numero solo necesitamos probar 5.000 opciones

hasta aquí tienes una buena opción para dejar... pero como estamos locos



necesitamos ir más profundo

sabemos que al eliminar los pares, eliminabamos el 50% de las opciones... pero al eliminar los multiplos de 3, eliminamos otro 15% del total (no es 33% porque 1 de cada 2 multiplos de 3, es par... 3,6,9,12,15,18) así que de 5000, iríamos a 3500...

pero veamos... tendríamos que hacer un if con %2 y %3 el ciclo debería empezar en 5 (el primer primo luego de 2 y 3.... y deberíamos probar para 7... luego, no vale la pena probar para 9 (porque es multiplo de 3, pero si para 11... tenemos un patron

a probar colocaré ? multiplos de 2 y 3, colocaré · (cada simbolo representa un numero, empezaré con 123 para que se vea y luego solo simbolos)

Código:
123·?·?···?·?···?·?···?·?···?·?···?·?

se ve el recorrido claro probar, saltar, probar, saltar 3 y repetir.... para no hacer un ciclo irregular sino directo, podríamos saltar 6 por vez y hacer 2 if por ciclo...

Código:
123·?·?···?·?···?·?···?·?···?·?···?·?
----i·····c·····c·····c·····c·····c···

dejando el codigo en
Código
  1. bool es_primo(int numero){
  2.  
  3.  if(numero <= 3 && numero > 1){// todo numero menor a 3 y mayor a 1
  4.    return true; // es primo... si el uno no es primo
  5.  }
  6.  
  7.  if(numero%2==0 || numero%3==0){//si es par o multiplo de 3
  8.   return false;// no es primo
  9.  }
  10.  
  11.  int i;
  12.  
  13.  for(i = 5; i*i <= numero; i+=6){// desde 5 hasta raíz del numero
  14.    if(numero%i== 0 || numero %(i+2)==0){
  15.      return false;//no es primo
  16.    }
  17. }
  18. return true; // si no hay divisores es primo
  19. }


parece una locura... es un camino largo... pero así se aprende y cada vez aprendes a darle la vuelta a los codigos... aqí si el numero es primo solo tenemos que calcular 3500 posibilidades... si no, de antemano descartamos el 65% de las posibilidades... vale la pena ir más profundo? está en ti calcularlo, pero yo diría que no, porque la eficiencia obtenida es muy baja....




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.
PalitroqueZ


Desconectado Desconectado

Mensajes: 677



Ver Perfil
Re: Que puedo hacer para mejorar mi logica de programacion??
« Respuesta #2 en: 13 Agosto 2017, 21:04 »

algun consejo que me puedan dar ? por que se me hace un poco complicado resolver ciertas cosas muchas gracias ;-) ;-)

tienes que pensar como piensa una máquina (suena extraño pero es asi).

en primer lugar, tienes que abandonar la idea de dar por hecho cosas basicas, es como en las clases de lógica, cuando mandan hacer un diagrama de flujo de tus actividades en la mañana.

la mayoría dirá, me levanto, y me voy al trabajo.

lo cuál es incompleto, hay que describir todos los pasos que haces desde que abres los ojos en la cama, hasta que cierras la puerta de tu casa rumbo al trabajo.

asi es que lo entenderá la maquina.
En línea

"La propiedad privada es la mayor garantía de libertad." Friedrich August von Hayek
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Libros de Logica de Programacion
Programación C/C++
cucorockero 1 1,903 Último mensaje 14 Septiembre 2006, 16:22
por [Addam]
Web interesante para aprender la lógica de la programación
Programación General
Chamanik 3 4,836 Último mensaje 24 Diciembre 2010, 18:48
por Freishner
Que puedo hacer (lenguaje de programacion)
Programación General
dizzy18 8 1,614 Último mensaje 9 Abril 2015, 14:13
por engel lex
como puedo mejorar mi programacion
Programación C/C++
MRx86 1 424 Último mensaje 14 Octubre 2016, 23:36
por Poyoncio
Matemática, ¿cómo puedo mejorar velocidad de hacer cuentas ?
Foro Libre
GGZ 4 366 Último mensaje 11 Noviembre 2017, 13:44
por PalitroqueZ
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines