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)
| | |-+  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 11,635 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #10 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
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4.  
  5. void primo(void);
  6. void perfecto(int num);
  7.  
  8. int main(void){
  9.  
  10. primo();
  11.  
  12. printf("\n\n");
  13. return 0;
  14. }
  15.  
  16. void primo(void){
  17. int num,j, a=0;
  18. for(num=0; num<=13; num++){
  19. for(j=1; j<=num; j++){
  20. if(num%j==0){
  21. a++;
  22. }
  23. }
  24. if(a==2){
  25. perfecto(num);
  26. }
  27. a=0;
  28. }
  29. }
  30.  
  31. void perfecto(int num){
  32. int auxUno=0, auxDos=0;
  33. char perfecto[100];
  34. auxUno = pow(2,num-1);
  35. auxDos = pow(2,num)-1;
  36. sprintf(perfecto,"%d", auxUno * auxDos);
  37.  
  38. printf("\n %s ", perfecto);
  39. }

     

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   


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 #11 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
  1. #include <stdio.h>
  2.  
  3. long unsigned int numero_perfecto_metodo1(int primo);
  4. long unsigned int numero_perfecto_metodo2(int primo);
  5. bool es_primo(int numero);
  6.  
  7. int main(void){
  8. unsigned long int perfecto;//para 64 bits completos de precision
  9. int actual;
  10. for(actual = 2; actual <=31; actual++){ //recorre primos del 2 al 27
  11. if(actual==11)actual = 13; //descarto el error del 11
  12. if(es_primo(actual)){ //si el numero actual es primo
  13. perfecto = numero_perfecto_metodo1(actual); //evaluo
  14. printf("%d = resultado:\t %lu \n",actual,perfecto);
  15. }
  16. }
  17. return 0;
  18. }
  19. long unsigned int numero_perfecto_metodo1(int primo){
  20. unsigned long int resultado;
  21. resultado = 1<<(primo-1);
  22. resultado *= (1<<primo)-1;//a*=b es lo mismo que a= a*b
  23. return resultado;
  24. }
  25. long unsigned int numero_perfecto_metodo2(int primo){
  26. unsigned long int resultado;
  27. resultado = (unsigned long int)((1<<primo)-1)<<(primo-1);//necesita casting (?)
  28. return resultado;
  29. }
  30. bool es_primo(int numero){
  31. if(numero == 2) return true; //2 es primo
  32. if(numero % 2 == 0) return false; //ningun multiplo de 2 es primo
  33. int prueba;
  34. for(prueba = 3;prueba*prueba < numero; prueba+=2){ //solo hasta la raiz
  35. if(numero%prueba==0) return false; //si tiene multiplo no es primo
  36. }
  37. return true; //entonces si es primo
  38. }

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


« Última modificación: 27 Septiembre 2014, 20:30 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 #12 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
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4. int a = 33550336, i, res=0;
  5. printf("\n\n");
  6. for(i=1; i<100000000; i++){
  7. if(a%i == 0){
  8. res += i;
  9. if(a == res){
  10. printf("%10d \n ========== \n%10d", i, res);
  11. break;
  12. }
  13. else{
  14. printf("%10d\n", i);
  15. }
  16. }
  17. }
  18.  
  19. printf("\n\n");
  20. return 0;
  21. }

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   
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 #13 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
  1. printf("%d = resultado:\t %lu \n",actual,perfecto);

\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)
« Última modificación: 27 Septiembre 2014, 20:34 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 #14 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.-



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 #15 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
  1. #include <stdio.h>
  2. #define true 1
  3. #define false 0
  4. long unsigned int numero_perfecto_metodo1(int primo);
  5. long unsigned int numero_perfecto_metodo2(int primo);
  6. int es_primo(int numero);
  7.  
  8. int main(void){
  9. unsigned long int perfecto;//para 64 bits completos de precision
  10. int actual;
  11. for(actual = 2; actual <=31; actual++){ //recorre primos del 2 al 27
  12. if(actual==11)actual = 13; //descarto el error del 11
  13. if(es_primo(actual)){ //si el numero actual es primo
  14. perfecto = numero_perfecto_metodo1(actual); //evaluo
  15. printf("%d = resultado:\t %lu \n",actual,perfecto);
  16. }
  17. }
  18. return 0;
  19. }
  20. long unsigned int numero_perfecto_metodo1(int primo){
  21. unsigned long int resultado;
  22. resultado = 1<<(primo-1);
  23. resultado *= (1<<primo)-1;//a*=b es lo mismo que a= a*b
  24. return resultado;
  25. }
  26. long unsigned int numero_perfecto_metodo2(int primo){
  27. unsigned long int resultado;
  28. resultado = (unsigned long int)((1<<primo)-1)<<(primo-1);//necesita casting (?)
  29. return resultado;
  30. }
  31. int es_primo(int numero){
  32. if(numero == 2) return true; //2 es primo
  33. if(numero % 2 == 0) return false; //ningun multiplo de 2 es primo
  34. int prueba;
  35. for(prueba = 3;prueba*prueba < numero; prueba+=2){ //solo hasta la raiz
  36. if(numero%prueba==0) return false; //si tiene multiplo no es primo
  37. }
  38. return true; //entonces si es primo
  39. }

cambié bool por int y definí true y false
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 #16 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
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <limits.h>
  4.  
  5. typedef enum { FALSE = 0, TRUE = 1 } BOOL;
  6.  
  7. BOOL is_prime( int p )
  8. {
  9.    if( p == 2 ) return TRUE;
  10.    else if( p <= 1 || p % 2 == 0 ) return FALSE;
  11.    else
  12.    {
  13.        BOOL prime = TRUE;
  14.        const int to = sqrt(p);
  15.        int i;
  16.        for(i = 3; i <= to; i+=2)
  17.            if (!(prime = p % i))break;
  18.        return prime;
  19.    }
  20. }
  21.  
  22. BOOL is_mersenne_prime( int p )
  23. {
  24.    if( p == 2 )
  25.        return TRUE;
  26.    else
  27.    {
  28.        unsigned m_p = ( 1U << p ) - 1;
  29.        unsigned s = 4;
  30.        int i;
  31.        for (i = 3; i <= p; i++)
  32.            s = (s * s - 2) % m_p;
  33.        return s == 0;
  34.    }
  35. }
  36.  
  37. int main(void)
  38. {
  39.    int p;
  40.  
  41.    for( p = 2; p <= 13; p += 1 )
  42.        if( is_prime(p) && is_mersenne_prime(p) )
  43.           numero_perfecto(p);
  44.           /*printf("%d ", p);*/
  45.    printf("\n");
  46.  
  47.    return 0;
  48. }
  49.  

Un Saludo
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #17 en: 27 Septiembre 2014, 22:28 pm »

Blaster seguro que solo con los primos de mersenne?

es decir...son los numeros tal que


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
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 #18 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

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
  1. prueba*prueba <= numero

Debido a esto validaba el nueve como un primo


En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



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


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,253 Ú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 21,910 Último mensaje 29 Junio 2012, 21:36 pm
por ERIK546
[C++] [?] Numeros perfectos
Programación C/C++
-JohnWalls 2 2,825 Último mensaje 7 Diciembre 2014, 20:33 pm
por -JohnWalls
Programa Numeros Perfectos C++
Programación C/C++
HIDE_95 2 3,595 Ú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,270 Ú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