Título: Números perfectos (lenguaje C) Publicado por: NOB2014 en 25 Septiembre 2014, 20:05 pm Hola a todos.
Código
El inconveniente es que si pongo #define MAX 10000 el resultado lo muestra en un periodo de tiempo aceptable, pero si deseo saber del 1 al 100000 muestra ==> 6- 28 – 496 – 8128 y de aquí en más tarda en términos de computación una eternidad (para terminar el programa).- La consulta es, ¿sabe alguien otra manera de hacerlo?, mi computadora si bien es un poco vieja (2gb de ram) me parecería que tendría que mostrarlo al instante, pero no es así.- Desde ya muchas gracias.- Saludos. Daniel Título: Re: Números perfectos (lenguaje C) Publicado por: ivancea96 en 25 Septiembre 2014, 21:00 pm *La capacidad de la RAM en este caso no es especialmente relevante.
En cuanto al tema, no necesitas dar X iteraciones para un número X. Basta con poner de tope la raíz cuadrada del número. Una vez encontrados los divisores inferiores a la raiz cuadrada, los divisores superiores son, siendo el divisor inferior 'N', X/N. Dado que K*N = X, una vez sacamos un divisor, por ejemplo N, ya tenemos también K. En caso de que X sea un cuadrado perfecto, X/N==N, por lo que no habría que sumarlo. En definitiva, esto no es un problema de C++, esto es un problema de algoritmia y matemáticas, quizás fuera más correcto colocarlo en el Foro Libre o en Programación General. Título: Re: Números perfectos (lenguaje C) Publicado por: engel lex en 25 Septiembre 2014, 21:11 pm rayos ivancea96 te me adelantaste! estaba preparando la respuesta jejeje igual allí voy (en gran parte para repetirte)
lo importante aquí no es la ram, ya que el programa solo usa 3 int (en total 12bytes) + el programa en si que dudo que llegue a 100kb... esto no llegará a 1mb de ram... el problema aquí es el tiempo de procesamiento, es decir la velocidad del procesador contra la cantidad de operaciones hechas, por la estructura de tu programa el hace x! operaciones donde x es MAX es decir cada paso la cantidad de cálculos aumenta brutalmente por otro lado algo que tarda es el printf, es preferible que guardes en un array y luego imprimas, es más rápido guardar 4bytes en la ram que iniciar todo un proceso para imprimir en pantalla realmente no estoy claro sobre tu proceso de los "números perfectos" pero intenta buscar alguna formula que te resuma el ciclo -------agrego-------- estuve investigando y según Euclides los números perfectos se basan en esta formula (http://upload.wikimedia.org/math/0/9/b/09b430032441a41d53299656e04741bd.png) donde "n" es un numero primo... esa es tu solucion ej: Citar n = 2: 21 × (22 – 1) = 6 n = 3: 22 × (23 – 1) = 28 n = 5: 24 × (25 – 1) = 496 n = 7: 26 × (27 – 1) = 8128 esa forma debe ser infinitamente más ligera para el procesador especialmente si lo haces con desplazamiento de bits, porque son potencias de 2 Título: Re: Números perfectos (lenguaje C) Publicado por: NOB2014 en 25 Septiembre 2014, 21:21 pm Hola ivancea99.
Citar Te agradezco el aporte, si en algún momento te encuentras con tiempo libre te agradecería si pones un poco de código, con mis 62 años me cuesta recordar raíz cuadradas y demás, sé que es algo que indefectiblemente voy a tener que estudiar si quiero aprender a programar, pero en este momento estoy en el tema funciones en c y es lo que me pide el libro hacer.- Mientras estaba tratando de solicitar ayuda y agradecer a ivancea99 me aparece el cartelito rojo advirtiendo que hubo otra respuesta al tema… engel lex creo que estas en lo cierto “si lo haces con desplazamiento de bits” lo voy a intentar, aunque a fuerza de ser prejuicioso no creo que lo logre por mi mismo Saludos. Daniel Título: Re: Números perfectos (lenguaje C) Publicado por: Shout en 25 Septiembre 2014, 22:07 pm Hola ivancea99. Hazlo multiplicando, seguramente el compilador lo optimice a bitshifts.Mientras estaba tratando de solicitar ayuda y agradecer a ivancea99 me aparece el cartelito rojo advirtiendo que hubo otra respuesta al tema… engel lex creo que estas en lo cierto “si lo haces con desplazamiento de bits” lo voy a intentar, aunque a fuerza de ser prejuicioso no creo que lo logre por mi mismo Saludos. Daniel Título: Re: Números perfectos (lenguaje C) Publicado por: engel lex en 25 Septiembre 2014, 22:20 pm es muy simple, resumes toda la operacion a una sola linea... pero ahora tienes un problema diferente pero más simple, buscar numeros primos jejeje la operacion de numeros primos se ha hablado mucho en el foro y hay soluciones rapidas y creativas... eso si, descubrirás el uso de unsigned y long porque estás usando numero MUY grandes...
me diste algo que investigar, estuve viendo la progesion completa (sin importar si eran primos o no) en binario y son muy simple en ese aspecto... pero me da un error que no descubro la razón... alquien me da ayuda? Código: 2 = resultado: 0000000000000000000000000000000000000000000000000000000000000110 en el 31 aún y cuando son solo desplazamientos se salta un 1 en el penultimo bit y 32 el ultimo en lugar de desbordarse, se limpió (no pongo el código por razones del post) Hazlo multiplicando, seguramente el compilador lo optimice a bitshifts. cierto! :P igual no son operaciones tan pesadasTítulo: Re: Números perfectos (lenguaje C) Publicado por: NOB2014 en 25 Septiembre 2014, 22:47 pm Considerando mi nivel de programación y atento a lo que me proponen me despido por unos 6 meses :rolleyes: :huh: ;D, espero que la pasen muy bien y un gran abrazo, cuando tenga el programa completado y funcionando regreso.-
Saludos. Daniel Título: Re: Números perfectos (lenguaje C) Publicado por: engel lex en 25 Septiembre 2014, 23:04 pm Considerando mi nivel de programación y atento a lo que me proponen me despido por unos 6 meses :rolleyes: :huh: ;D, espero que la pasen muy bien y un gran abrazo, cuando tenga el programa completado y funcionando regreso.- Saludos. Daniel jejeje no seas dramatico! tranquilo que pensandolo eso sale, como dice Shout puedes hacerlo con multiplicaciones... o tomando su palabra, puedes incluso hacerlo con la libreria "<cmath>" y usando pow como en estos ejemplos (http://www.cplusplus.com/reference/cmath/pow/) Título: Re: Números perfectos (lenguaje C) Publicado por: Blaster en 25 Septiembre 2014, 23:36 pm La consulta es, ¿sabe alguien otra manera de hacerlo?, mi computadora si bien es un poco vieja (2gb de ram) me parecería que tendría que mostrarlo al instante, pero no es así.- Aquí tienes un código bastante interesante, que a mi parecer es bastante rápido : Código
Fuente : http://rosettacode.org/wiki/Factors_of_an_integer#Prime_factoring (http://rosettacode.org/wiki/Factors_of_an_integer#Prime_factoring) Solo le hice una pequeña modificación en el main para adaptarlo a tu propósito Un Saludo Título: Re: Números perfectos (lenguaje C) Publicado por: NOB2014 en 26 Septiembre 2014, 15:46 pm Hola Blaster.
Muchas gracias por tú aporte, en realidad es mucho más rápido que el que yo postee, por lo menos los primeros cuatros aparecen al instante pero el quinto no me aparece nunca, de cualquier manera voy a intentar implementar lo de engel lex, me parece que de esa manera va a funcionar muy bien.- Citar n = 2: 21 × (22 – 1) = 6 n = 3: 22 × (23 – 1) = 28 n = 5: 24 × (25 – 1) = 496 n = 7: 26 × (27 – 1) = 8128 Mil disculpas si se me pasó por alto agradecer a alguien y les pongo esta página que está relacionada y me causo mucha gracia.- http://curiotecnology.blogspot.com.ar/2012/05/los-5-numeros-perfectos-java.html Saludos. Daniel Título: Re: Números perfectos (lenguaje C) Publicado por: NOB2014 en 27 Septiembre 2014, 16:48 pm Hola, buen día.-
engel lex realmente una genialidad lo tuyo, me allano mucho el camino y gracias a todos los que propusieron algo parecido y al resto.- Código
(http://i61.tinypic.com/121cs3r.jpg) Lo que me traen son 2 consultas: La primera es, porque el error del quinto número perfecto, según estas 2 páginas el quinto debería ser 33 550 336 y a mí me sale en el sexto lugar.- http://es.wikipedia.org/wiki/N%C3%BAmero_perfecto http://curiotecnology.blogspot.com.ar/2012/05/los-5-numeros-perfectos-java.html La segunda, ¿se puede poner los dos resultado (auxUno y auxDos) en un arreglo de char y multiplicarlos para alojarlo en la variable perfecto?, esto me surge porque el séptimo número perfecto no cabe en una variable del tipo int.- Espero haberme explicado lo suficiente.- Saludos. Daniel Título: Re: Números perfectos (lenguaje C) Publicado por: engel lex en 27 Septiembre 2014, 19:49 pm el quito numero es algo que no había leido, la forma da los perfectos cuando n es primo... y diferente de 11, aparentemente 11 es el unico primo no perfecto... disculpas por lo haber visto eso D:
este es mi código usando desplazamiento de bits solo por muestra como sería según yo ;) comentado y usando iostream porque me da pereza el printf ;D no uso el metodo 2 pero funciona Código
ese metodo de primos está bien documentado aquí en el foro, un numero para saber primo solo hay que investigar hasta su raiz, más allá todo se repite, al excluir los 2 al final el tiempo de calculo se baja desde "n" ciclos hasta "raiz(n) /2" ciclos ej, el 1.000.001 baja de ser 1.000.001 ciclos hasta 500... para ser sincero se que el metodo 2 necesita casting de tipo, pero no estoy seguro por que... Título: Re: Números perfectos (lenguaje C) Publicado por: NOB2014 en 27 Septiembre 2014, 20:17 pm Hola.
Con el siguiente programita queda demostrado que el 11 primo no es un número perfecto.- Código
En el caso del programa tuyo lamentablemente no lo voy a poder correr porque desconozco totalmente C++, me gustaría saber cuál es el perfecto más grande que logras, pero bueno… Saludos. Daniel Título: Re: Números perfectos (lenguaje C) Publicado por: engel lex en 27 Septiembre 2014, 20:33 pm ya, puedes copiar de mi ultimo post, modificadas 3 lineas del codigo para hacerlo 100% c ;D
en Código \t es una tabulacion para un espaciador "justificado" %lu es para imprimir un long unsigned int (%u es unsigned int, %l es long int y se mezclan en uno) Título: Re: Números perfectos (lenguaje C) Publicado por: NOB2014 en 27 Septiembre 2014, 21:18 pm Hola.
Por suerte no puedo ver el movimiento de tus manos ni el gesto de tú cara al leerme nuevamente, tenele un poco de paciencia al “abuelo” Daniel.- ;D ;D ;D Me podría decir como corregir los siguiente errores, según tengo leído true y false no existen en c.- (http://i62.tinypic.com/28vab8p.png) Saludos. Daniel Título: Re: Números perfectos (lenguaje C) Publicado por: engel lex en 27 Septiembre 2014, 21:48 pm oh... sorry! :P ya voy a arreglarlo, casi no trabajo en c y olvido que no tiene booleanos :-X
Código
cambié bool por int y definí true y false Título: Re: Números perfectos (lenguaje C) Publicado por: Blaster en 27 Septiembre 2014, 22:17 pm Para generar los cinco números perfectos conocidos (6, 28, 496, 8128, 33550336) con la formula de Euclides es necesario trabajar con los primos de mersenne (2, 3, 5, 7, 13) aquí un ejemplo :
Código
Un Saludo Título: Re: Números perfectos (lenguaje C) Publicado por: engel lex en 27 Septiembre 2014, 22:28 pm Blaster seguro que solo con los primos de mersenne?
es decir...son los numeros tal que (http://upload.wikimedia.org/math/d/e/9/de90513728abb241a608aaa1ac5c457f.png) Citar where p is assumed prime. entonces la secuencia da Citar 22-1 = 3 23-1 = 7 25-1 = 31 no están el 2, 5, 13, 17,23... sin embargo son tomados en la secuencia de los perfectos... así que creo que la teoría es incorrecta Título: Re: Números perfectos (lenguaje C) Publicado por: Blaster en 27 Septiembre 2014, 23:52 pm Blaster seguro que solo con los primos de mersenne? entonces la secuencia da no están el 2, 5, 13, 17,23... sin embargo son tomados en la secuencia de los perfectos... así que creo que la teoría es incorrecta Con el algoritmo que propuse por supuesto se obtienen esa secuencia de primos menos el 23 el cual no forma parte de la secuencia de números perfectos en ves debes incluir el tres. Estoy utilizando la prueba de Lucas-Lehmer : http://es.wikipedia.org/wiki/Test_de_Lucas-Lehmer (http://es.wikipedia.org/wiki/Test_de_Lucas-Lehmer) Para descartar todos los primos no valido, por otra parte en la función es_primo en tu código tienes un pequeño error la condición del for debe quedar así Código
Debido a esto validaba el nueve como un primo Título: Re: Números perfectos (lenguaje C) Publicado por: NOB2014 en 28 Septiembre 2014, 00:58 am Hola.
Estoy de acuerdo y con esa modificación los primos están correctos pero los perfectos me parece que no.- (http://i62.tinypic.com/2s9spic.png) Saludos. Daniel Título: Re: Publicado por: ivancea96 en 28 Septiembre 2014, 01:12 am Usa unsigned long long, para números más grandes.
Título: Re: Números perfectos (lenguaje C) Publicado por: Blaster en 28 Septiembre 2014, 04:48 am Estoy de acuerdo y con esa modificación los primos están correctos pero los perfectos me parece que no.- El problema con el código del compañero es que de igual manera procesa los primos no validos (23, 29) y también mencionar el desbordamiento de enteros producido, he aquí un ejemplo que calcula los ocho números perfectos : Código
Puedes comprobarlo aquí : http://www.vaxasoftware.com/doc_edu/mat/numperfe_esp.pdf Un saludo Título: Re: Números perfectos (lenguaje C) Publicado por: rir3760 en 30 Septiembre 2014, 04:34 am me diste algo que investigar, estuve viendo la progesion completa (sin importar si eran primos o no) en binario y son muy simple en ese aspecto... pero me da un error que no descubro la razón El problema es que solo presentas la salida del programa, sin el código fuente no es posible conocer la causa del error (imagino tiene que ver con tu otra duda).para ser sincero se que el metodo 2 necesita casting de tipo, pero no estoy seguro por que El segundo metodo es:Código El cual se puede abreviar a: Código El problema ahí es la primera literal 1, esta es de tipo signed int y puede, dependiendo del desplazamiento, generar un numero negativo. Para solucionarlo lo mas fácil es indicar que el tipo de ella es unsigned long mediante sufijos: 1UL. Un saludo |