Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - avesudra

#771
Pues ni idea la verdad , igual es que mis librerias como las compile para mi ordenador no sirven para el tuyo...
#772
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;
}
#773
Eso me dá a mí , a ti ¿cuanto te dá? ¿Que página es?
#774
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?
#775
Es un placer ayudar , pues sí , me servirá hasta a mi porque cuando pusiste eso en el tema que creaste , no me acordaba de como compilarla , sin embargo aquí tengo un documento por si no me acuerdo.
¡Saludos!
#776
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.

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

¡Un saludo!
#777
Ya está listo dame un momento y te publico lo que está mal...
#778
Estoy mirando el código y ten mucho cuidado con las funciones que utilizas , mira la función esta lo que retorna:
mpz_cdiv_ui(resultado, 10)
No retorna el número dividido , sino el resto de la división...
#779
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?
#780
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)