¿Uso mal las funciones de la librería GMP?

Iniciado por DickGumshoe, 6 Julio 2012, 16:17 PM

0 Miembros y 1 Visitante están viendo este tema.

DickGumshoe

¡Muchas gracias! Creía que era esa función la de dividir...

La suma no da... Así que he puesto esto:

while(mpz_cmp_ui(resultado, 0) >0)
    {//BUCLE INFINITO
        suma += mpz_mod_ui(mod, resultado, 10); //suma = suma + el resto de dividir resultado entre 10
        mpz_tdiv_q_ui(resultado, resultado, 10); //Dividimos resultado entre 10
        printf("%d\n", suma); //Además de que el bucle es infinito, he comprobado que la suma la hace mal.
        getchar();

    }


Para ver qué pasaba, y los primeros números los suma bien, pero a partir de 565 sale un número muy grande, números negativos, etc. (no sé por qué salen negativos, cuando "suma" es unsigned long int...)...

avesudra

Pues es que unsigned long int , es de 4 bytes de longitud 4*8= 32 bits , o sea que solo puede contener hasta 232=4,294,967,295 , pero eso no tiene nada que ver porque esas cifras no suman tal cantidad de numeros, así que no sé , cuanto debe de dar la suma entonces?
Regístrate en

DickGumshoe

El problema es de una página muy conocida de retos de programación, por lo que buscando en Internet acabo de ver que da 1366. No sé si será el resultado correcto...

avesudra

Eso me dá a mí , a ti ¿cuanto te dá? ¿Que página es?
Regístrate en

DickGumshoe

Qué raro... A mí me da 1620828886. La página es Project Euler.

avesudra

#15
A ver vamos a hacer una cosa , vamos a guardarla en la variable suma pero está ahora vá a ser de tipo mpz_t ahora te paso el codigo a ver que tal , pero me parece rarísimo.Toma aquí tienes , ahora lo que he hecho es que la variable suma es de tipo mpz_t

#include <stdio.h>
#include <gmp.h>


int main()
{
   mpz_t num, resultado, mod,suma; //Variables
   mpz_inits(resultado,mod,suma,NULL);//Resultado suma y mod inicializado a 0;
   mpz_init_set_ui(num, 2); //Inicializo num a 2
   mpz_pow_ui(resultado, num, 1000); // 2^1000
   gmp_printf("Resultado: %Zd\n\n", resultado); //Imprimo 2^1000, y el resultado es correcto

   while(mpz_cmp_ui(resultado, 0) > 0)
   {//BUCLE NO INFINITO
        mpz_add_ui(suma,suma,mpz_mod_ui(mod, resultado, 10)); //suma = suma + el resto de dividir resultado entre 10
       //printf("SUMA :%d \n", suma); Probando la suma...
       mpz_tdiv_q_ui(resultado,resultado, 10);//Realizamos una division entre 10 y no redondeamos, lo que sobra lo truncamos.
       //mpz_set_ui(resultado, mpz_cdiv_ui(resultado, 10)); Esto está mal , la función mpz_cdiv_ui devuelve el resto de la division!!
       gmp_printf("Suma: %Zd\n\n", suma); //Además de que el bucle es infinito, he comprobado que la suma la hace mal.
       //getchar();

   }
   gmp_printf("Suma final: %Zd\n\n", suma);
   mpz_clears(resultado,num,mod,suma,NULL); //Liberamos memoria
   getchar();
   return 0;
}

Vamos a ver una cosa compila este código y dime lo que te sale también...
#include <stdio.h>

int main()
{
    printf("El tamano de un unsigned long int en tu maquina es de: %d bytes",sizeof(unsigned long int));
    getchar();
    return 0;
}
Regístrate en

DickGumshoe

Tanto en tu código como en uno que he hecho yo (que ha resultado ser igual que el tuyo), me da 43123298370...  :(

DickGumshoe


avesudra

Pues ni idea la verdad , igual es que mis librerias como las compile para mi ordenador no sirven para el tuyo...
Regístrate en

DickGumshoe

Yo creo que sí sirven, porque sino me daría error al compilar, o me daría mal 21000... Veré que puedo hacer.

Gracias por haberme ayudado!

Saludos.