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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Números perfectos (lenguaje C)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Números perfectos (lenguaje C)  (Leído 12,814 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Números perfectos (lenguaje C)
« en: 25 Septiembre 2014, 20:05 pm »

Hola a todos.

Código
  1. #include <stdio.h>
  2.  
  3. #define MAX 10000
  4. void numerosPerfectos();
  5.  
  6. int main(void){
  7.  
  8. numerosPerfectos();
  9.  
  10. return 0;
  11. }
  12.  
  13. void numerosPerfectos(){
  14. int acumulador=0, i, j=1;
  15.  
  16. printf("\n\n N%cmeros perfectos...: ", 163);
  17.  
  18. for(i=1; i<MAX; i++){
  19. acumulador = 0;
  20. for(j=1; j<i; j++){
  21. if(i % j == 0){
  22. acumulador += j;
  23. }
  24. }
  25. if(i == acumulador){
  26. printf(" %d ", i);
  27. }
  28. }
  29. }

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   


En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Números perfectos (lenguaje C)
« Respuesta #1 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.


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #2 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

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
« Última modificación: 25 Septiembre 2014, 21:23 pm por engel lex » 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.
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #3 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
« Última modificación: 25 Septiembre 2014, 21:23 pm por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Shout

Desconectado Desconectado

Mensajes: 191


Acid


Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #4 en: 25 Septiembre 2014, 22:07 pm »

Hola ivancea99.     
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
Hazlo multiplicando, seguramente el compilador lo optimice a bitshifts.
En línea

I'll bring you death and pestilence, I'll bring you down on my own
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #5 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
3 = resultado: 0000000000000000000000000000000000000000000000000000000000011100
4 = resultado: 0000000000000000000000000000000000000000000000000000000001111000
5 = resultado: 0000000000000000000000000000000000000000000000000000000111110000
6 = resultado: 0000000000000000000000000000000000000000000000000000011111100000
7 = resultado: 0000000000000000000000000000000000000000000000000001111111000000
8 = resultado: 0000000000000000000000000000000000000000000000000111111110000000
9 = resultado: 0000000000000000000000000000000000000000000000011111111100000000
10 = resultado: 0000000000000000000000000000000000000000000001111111111000000000
11 = resultado: 0000000000000000000000000000000000000000000111111111110000000000
12 = resultado: 0000000000000000000000000000000000000000011111111111100000000000
13 = resultado: 0000000000000000000000000000000000000001111111111111000000000000
14 = resultado: 0000000000000000000000000000000000000111111111111110000000000000
15 = resultado: 0000000000000000000000000000000000011111111111111100000000000000
16 = resultado: 0000000000000000000000000000000001111111111111111000000000000000
17 = resultado: 0000000000000000000000000000000111111111111111110000000000000000
18 = resultado: 0000000000000000000000000000011111111111111111100000000000000000
19 = resultado: 0000000000000000000000000001111111111111111111000000000000000000
20 = resultado: 0000000000000000000000000111111111111111111110000000000000000000
21 = resultado: 0000000000000000000000011111111111111111111100000000000000000000
22 = resultado: 0000000000000000000001111111111111111111111000000000000000000000
23 = resultado: 0000000000000000000111111111111111111111110000000000000000000000
24 = resultado: 0000000000000000011111111111111111111111100000000000000000000000
25 = resultado: 0000000000000001111111111111111111111111000000000000000000000000
26 = resultado: 0000000000000111111111111111111111111110000000000000000000000000
27 = resultado: 0000000000011111111111111111111111111100000000000000000000000000
28 = resultado: 0000000001111111111111111111111111111000000000000000000000000000
29 = resultado: 0000000111111111111111111111111111110000000000000000000000000000
30 = resultado: 0000011111111111111111111111111111100000000000000000000000000000
31 = resultado: 0101111111111111111111111111111111000000000000000000000000000000
32 = resultado: 0000000000000000000000000000000000000000000000000000000000000000

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 pesadas
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.
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #6 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   
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #7 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
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.
Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #8 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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. char bits[65536];
  7.  
  8. typedef unsigned long ulong;
  9. ulong primes[7000], n_primes;
  10.  
  11. typedef struct
  12. {
  13.    ulong p, e;
  14. } prime_factor;
  15.  
  16. void sieve(void)
  17. {
  18.    int i, j;
  19.    memset(bits, 1, 65536);
  20.    bits[0] = bits[1] = 0;
  21.    for (i = 0; i < 256; i++)
  22.        if (bits[i])
  23.            for (j = i * i; j < 65536; j += i)
  24.                bits[j] = 0;
  25.    for (i = j = 0; i < 65536; i++)
  26.        if (bits[i]) primes[j++] = i;
  27.  
  28.    n_primes = j;
  29. }
  30.  
  31. int get_prime_factors(ulong n, prime_factor *lst)
  32. {
  33.    ulong i, e, p;
  34.    int len = 0;
  35.  
  36.    for (i = 0; i < n_primes; i++)
  37.    {
  38.        p = primes[i];
  39.        if (p * p > n) break;
  40.        for (e = 0; !(n % p); n /= p, e++);
  41.        if (e)
  42.        {
  43.            lst[len].p = p;
  44.            lst[len++].e = e;
  45.        }
  46.    }
  47.    return n == 1 ? len : (lst[len].p = n, lst[len].e = 1, ++len);
  48. }
  49.  
  50. int ulong_cmp(const void *a, const void *b)
  51. {
  52.    return *(const ulong*)a < *(const ulong*)b ? -1 : *(const ulong*)a > *(const ulong*)b;
  53. }
  54.  
  55. int get_factors(ulong n, ulong *lst)
  56. {
  57.    int n_f, len, len2, i, j, k, p;
  58.    prime_factor f[100];
  59.  
  60.    n_f = get_prime_factors(n, f);
  61.  
  62.    len2 = len = lst[0] = 1;
  63.    for (i = 0; i < n_f; i++, len2 = len)
  64.        for (j = 0, p = f[i].p; j < f[i].e; j++, p *= f[i].p)
  65.            for (k = 0; k < len2; k++)
  66.                lst[len++] = lst[k] * p;
  67.  
  68.    qsort(lst, len, sizeof(ulong), ulong_cmp);
  69.    return len;
  70. }
  71.  
  72. int main(void)
  73. {
  74.    int j;
  75.    ulong fac[10000], n, sum;
  76.  
  77.    sieve();
  78.  
  79.    for (n = 2; n < 33550337; n++)
  80.    {
  81.        j = get_factors(n, fac) - 1;
  82.        for (sum = 0; j && sum <= n; sum += fac[--j]);
  83.           if (sum == n)
  84.              printf("%lu\n", n);
  85.    }
  86.    return 0;
  87. }
  88.  

Fuente : 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
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #9 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   
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SRC] [Delphi] Números perfectos [by *PsYkE1*]
Programación General
Psyke1 0 2,449 Último mensaje 26 Agosto 2010, 16:48 pm
por Psyke1
Programa en C que imprime los primeros m números perfectos
Programación C/C++
ERIK546 3 22,500 Último mensaje 29 Junio 2012, 21:36 pm
por ERIK546
[C++] [?] Numeros perfectos
Programación C/C++
-JohnWalls 2 3,140 Último mensaje 7 Diciembre 2014, 20:33 pm
por -JohnWalls
Programa Numeros Perfectos C++
Programación C/C++
HIDE_95 2 3,919 Último mensaje 4 Agosto 2015, 21:34 pm
por HIDE_95
Numeros amigos y numeros perfectos programa en C
Programación C/C++
estudiante_1 2 5,751 Último mensaje 11 Agosto 2015, 23:51 pm
por estudiante_1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines