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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  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,625 veces)
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re:
« Respuesta #20 en: 28 Septiembre 2014, 01:12 am »

Usa unsigned long long, para números más grandes.


En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #21 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
  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))
  18.                break;
  19.        return prime;
  20.    }
  21. }
  22.  
  23. BOOL is_mersenne_prime( int p )
  24. {
  25.    if( p == 2 )
  26.        return TRUE;
  27.    else
  28.    {
  29.        long long unsigned m_p = ( 1U << p ) - 1;
  30.        long long unsigned s = 4;
  31.        int i;
  32.        for (i = 3; i <= p; i++)
  33.        {
  34.            s = (s * s - 2) % m_p;
  35.        }
  36.        return s == 0;
  37.    }
  38. }
  39.  
  40. int main(int argc, char **argv)
  41. {
  42.    const int upb = log2l(ULLONG_MAX)/2;
  43.    int p;
  44.  
  45.    for( p = 2; p <= upb; p++ )
  46.    {
  47.        if( is_prime(p) && is_mersenne_prime(p) )
  48.            printf(" %llu\n", (long long unsigned)(1U << (p - 1)) * ((1U << p) - 1));
  49.    }
  50.    printf("\n");
  51.  
  52.    return 0;
  53. }
  54.  

Puedes comprobarlo aquí :

http://www.vaxasoftware.com/doc_edu/mat/numperfe_esp.pdf

Un saludo


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Números perfectos (lenguaje C)
« Respuesta #22 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
  1. long unsigned int numero_perfecto_metodo2(int primo)
  2. {
  3.   unsigned long int resultado;
  4.   resultado = (unsigned long int) ((1 << primo) - 1) << (primo - 1);
  5.   return resultado;
  6. }
El cual se puede abreviar a:
Código
  1. long unsigned int numero_perfecto_metodo2(int primo)
  2. {
  3.   return ((1 << primo) - 1) << (primo - 1);
  4. }
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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
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,252 Ú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,896 Último mensaje 29 Junio 2012, 21:36 pm
por ERIK546
[C++] [?] Numeros perfectos
Programación C/C++
-JohnWalls 2 2,817 Último mensaje 7 Diciembre 2014, 20:33 pm
por -JohnWalls
Programa Numeros Perfectos C++
Programación C/C++
HIDE_95 2 3,588 Ú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,263 Ú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