|
772
|
Programación / Programación C/C++ / Re: ¿Uso mal las funciones de la librería GMP?
|
en: 6 Julio 2012, 17:43 pm
|
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 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)); return 0; }
|
|
|
776
|
Programación / Programación C/C++ / Re: ¿Uso mal las funciones de la librería GMP?
|
en: 6 Julio 2012, 17:13 pm
|
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? #include <stdio.h> #include <gmp.h> unsigned long int suma=0, i=0; //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" int main() { mpz_t num, resultado, mod; //Variables mpz_inits(resultado,mod,NULL);//Resultado 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 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("Resultado dividiendo: %Zd\n\n", resultado); printf("%lu\n", suma ); //Además de que el bucle es infinito, he comprobado que la suma la hace mal. } mpz_clears(resultado,num,mod,NULL); //Liberamos memoria return 0; }
¡Un saludo!
|
|
|
780
|
Programación / Programación C/C++ / Re: ¿Uso mal las funciones de la librería GMP?
|
en: 6 Julio 2012, 16:33 pm
|
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í : 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)
|
|
|
|
|
|
|