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


 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Uso mal las funciones de la librería GMP?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Uso mal las funciones de la librería GMP?  (Leído 8,131 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
¿Uso mal las funciones de la librería GMP?
« en: 6 Julio 2012, 16:17 »

Hola.

Gracias a Avesudra, ayer pude configurar la librería GMP en Codeblocks. Llevo toda la mañana intentando calcular la suma de todos los dígitos del resultado de hacer 21000. Lo que hago es esto:

Código
  1. #include <stdio.h>
  2. #include <gmp.h>
  3.  
  4. unsigned long int suma=0, i=0;
  5. //Lo pongo como variable global porque si lo meto en main() me dice "Suma dígitos.exe dejó de funcionar. Windows está buscando una solución"
  6.  
  7. int main()
  8. {
  9.  
  10.    mpz_t num, resultado, mod; //Variables
  11.  
  12.    mpz_set_ui(num, 2); //Inicializo num a 2
  13.    mpz_init(resultado); //resultado = 0
  14.    mpz_init(mod); //mod=0
  15.  
  16.    mpz_pow_ui(resultado, num, 1000); // 2^1000
  17.    gmp_printf("Resultado: %Zd\n\n", resultado); //Imprimo 2^1000, y el resultado es correcto
  18.  
  19.    while(mpz_cmp_ui(resultado, 0) > 0)
  20.    {//BUCLE INFINITO
  21.        suma += mpz_mod_ui(mod, resultado, 10); //suma = suma + el resto de dividir resultado entre 10
  22.        mpz_set_ui(resultado, mpz_cdiv_ui(resultado, 10)); //Dividimos resultado entre 10
  23.        printf("%d\n", suma); //Además de que el bucle es infinito, he comprobado que la suma la hace mal.
  24.  
  25.    }
  26.  
  27.  
  28.    printf("Suma: %d", suma);
  29.  
  30.    mpz_clear(resultado); //Liberamos memoria
  31.    mpz_clear(num);
  32.    mpz_clear(mod);
  33.  
  34.    return 0;
  35. }
  36.  

21000 lo hace bien, pero se queda en el while(), no sé por qué...

Mi idea era inicializar suma a 0, hallar el resto de dividir 21000 entre 10, y sumárselo, y así hasta que "resultado = 0", puesto que si llega a 0 significa que ya hemos sumado todas sus cifras.

¿Alguien tiene una idea de qué hago mal?

Muchas gracias.

Saludos.



En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #1 en: 6 Julio 2012, 16:21 »

Emmm... me parece que se te ha olvidado inicializar mpz_t num , no sé si ese es el único error , lo he mirado así por encima.

EDITO: Tienes que inicializar las variables antes de asignarles cualquier otro tipo de datos así que te falta:
Código:
mpz_init(num)
Oye una cosa¿ la condición del while en pseudocódigo  cual es?


« Última modificación: 6 Julio 2012, 16:28 por avesudra » En línea

Regístrate en
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #2 en: 6 Julio 2012, 16:28 »

Muchas gracias por responder.

Lo he inicializado, solo que dándole otro valor distinto de 0. Así:

Código
  1. mpz_set_ui(num, 2); //Inicializo num a 2

Además, debe estar bien, porque esa variable la utilizo para hacer 21000 y dicho resultado me da bien.

Saludos.
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #3 en: 6 Julio 2012, 16:33 »

Ah si perdona es que no había visto las funciones de inicialización y asignación combinadas en la documentación , de todas maneras es así :
Código
  1. mpz_init_set_ui (num, 2);
En cuanto al bucle que condición es la que quieres poner, que resultado sea igual a 0?
entonces sería así while(mpz_cmp_ui(resultado,0)!=0)
« Última modificación: 6 Julio 2012, 16:36 por avesudra » En línea

Regístrate en
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #4 en: 6 Julio 2012, 16:37 »

Muchas gracias por corregir esa función, con la que había puesto yo tenía que crear la variable resultado también porque sino me daba error.

Sí, lo que quiero poner en el while() es que mientras resultado > 0, haga todo eso.

Saludos.

EDITO: También puse esa condición y no salía...

EDITO 2: Creo que el error no es la condición, sino lo de dentro, ya que he probado a poner:

Código
  1. while(mpz_cmp_ui(resultado, 0) !=0)
  2.    {//BUCLE INFINITO
  3.        suma += mpz_mod_ui(mod, resultado, 10); //suma = suma + el resto de dividir resultado entre 10
  4.        mpz_set_ui(resultado, mpz_cdiv_ui(resultado, 10)); //Dividimos resultado entre 10
  5.        gmp_printf("%Zd\n", resultado); //Además de que el bucle es infinito, he comprobado que la suma la hace mal.
  6.  
  7.    }

Y no da nunca resultado/10...
« Última modificación: 6 Julio 2012, 16:43 por DickGumshoe » En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #5 en: 6 Julio 2012, 16:42 »

Ya he visto que no me funciona ...Voy a ver si te lo hago desde 0 , entonces recapitulamos , tenemos que sumar todos los dígitos de 21000¿no?
En línea

Regístrate en
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #6 en: 6 Julio 2012, 16:44 »

Sí, sería sumando los dígitos de 21000, pero ahora me he quedado con la curiosidad de por qué sale mal lo que he hecho... Seguiré probando, a ver si saco algo...
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #7 en: 6 Julio 2012, 16:50 »

Estoy mirando el código y ten mucho cuidado con las funciones que utilizas , mira la función esta lo que retorna:
Código:
mpz_cdiv_ui(resultado, 10)
No retorna el número dividido , sino el resto de la división...
En línea

Regístrate en
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #8 en: 6 Julio 2012, 16:59 »

Ya está listo dame un momento y te publico lo que está mal...
En línea

Regístrate en
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: ¿Uso mal las funciones de la librería GMP?
« Respuesta #9 en: 6 Julio 2012, 17:13 »

Pues mira te explico lo que tenías mal:
  • Primero de todo la función mpz_set_ui(num,2); no inicializaba resultado , era mpz_init_set_ui(num,2)
  • Segundo la función mpz_cdiv_ui(resultado, 10); no retornaba el número dividido si no el resto de la división
  • Tercero el especificador de conversion para un tipo unsigned long int es %lu
Y creo que no se me olvida más nada , mmm ah si el codigo ! ¿Que valor daba la suma?
Código
  1. #include <stdio.h>
  2. #include <gmp.h>
  3.  
  4. unsigned long int suma=0, i=0;
  5. //Lo pongo como variable global porque si lo meto en main() me dice "Suma dígitos.exe dejó de funcionar. Windows está buscando una solución"
  6.  
  7. int main()
  8. {
  9.  
  10.    mpz_t num, resultado, mod; //Variables
  11.    mpz_inits(resultado,mod,NULL);//Resultado y mod inicializado a 0;
  12.    mpz_init_set_ui(num, 2); //Inicializo num a 2
  13.    mpz_pow_ui(resultado, num, 1000); // 2^1000
  14.    gmp_printf("Resultado: %Zd\n\n", resultado); //Imprimo 2^1000, y el resultado es correcto
  15.  
  16.    while(mpz_cmp_ui(resultado, 0) > 0)
  17.    {//BUCLE NO INFINITO
  18.        suma += mpz_mod_ui(mod, resultado, 10); //suma = suma + el resto de dividir resultado entre 10
  19.        //printf("SUMA :%d \n", suma); Probando la suma...
  20.        mpz_tdiv_q_ui(resultado,resultado, 10);//Realizamos una division entre 10 y no redondeamos, lo que sobra lo truncamos.
  21.        //mpz_set_ui(resultado, mpz_cdiv_ui(resultado, 10)); Esto está mal , la función mpz_cdiv_ui devuelve el resto de la division!!
  22.        gmp_printf("Resultado dividiendo: %Zd\n\n", resultado);
  23.        printf("%lu\n", suma); //Además de que el bucle es infinito, he comprobado que la suma la hace mal.
  24.  
  25.    }
  26.    printf("Suma: %lu\n", suma);
  27.    mpz_clears(resultado,num,mod,NULL); //Liberamos memoria
  28.    getchar();
  29.    return 0;
  30. }
  31.  
¡Un saludo!
En línea

Regístrate en
Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Librería de funciones y scripts BATCH Actualizado 26/05/07 « 1 2 »
Scripting
ne0x 13 54,295 Último mensaje 6 Julio 2011, 02:10
por bITEBUG
Ayuda con funcion de libreria de funciones u.u
Scripting
FranciskoAsdf 0 1,294 Último mensaje 9 Septiembre 2008, 04:15
por FranciskoAsdf
Python, funciones o libreria ?
Scripting
EvilGoblin 2 5,091 Último mensaje 11 Julio 2010, 20:35
por xーいぱ
¿Que funciones puedo agregar a mi libreria?
Programación C/C++
megaerikivan 2 1,017 Último mensaje 17 Abril 2016, 20:35
por HardForo
Optimizar código, crear libreria de funciones.
PHP
raguel 3 1,305 Último mensaje 3 Agosto 2016, 03:04
por Dacan
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines