Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 25 Octubre 2012, 19:22 pm



Título: Como almacenar un numero de 10 cifras
Publicado por: Caster en 25 Octubre 2012, 19:22 pm
Pues esa es la duda, he empezado con un problema de los que me habeis dejado en otro post que he crado preguntando por algunos problemas y ya he elegido uno que me parece que pensando un poco puedo llegar a sacarlo, y ese es el primer problema que se me presenta, que tipo de variable puedo usar para almacenar un numero de 10 cifras, he probado de las siguientes maneras:

Código
  1. int x;
Código
  1. long int x;
Código
  1. long long int x;
Código
  1. unsigned long long int x;

Y ninguna me ha servido, la unica forma que se me ocurre es utilizando un array, pero aun no he llegado a leer sobre ellos y pereferia evitarlos. En el problema se me presenta que ese numero lo contiene un fichero, pero como tampoco se manejar ficheros, pues no puedo hacerlo de esa manera y creo que se puede hacer como quiero yo

Saludos


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: leosansan en 25 Octubre 2012, 19:39 pm
y ya he elegido uno que me parece que pensando un poco puedo llegar a sacarlo, y ese es el primer problema que se me presenta, que tipo de variable puedo usar para almacenar un numero de 10 cifras, he probado de las siguientes maneras:
Y ninguna me ha servido, la única forma que se me ocurre es utilizando un array,
Citar
El número que aparece en el ejemplo no está en un fichero, es el número. Si usaramos otros lenguajes podríamos manejarlo tal como viene, pero en C el tamaño-en cifras- es muy limitado, a no ser que uses librerias para el manejo de números grandes, que las hay.
Te propondría que intentes el de la suma todos los números naturales menores que mil que sean múltiplos de 3 ó 5. Verás lo que puede dar de sí un ejemplo tan sencillo


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: Caster en 25 Octubre 2012, 19:40 pm
Entonces que hago?


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: leosansan en 25 Octubre 2012, 19:42 pm
Entonces que hago?
Reedite el post anterior, léelo o cambia simplemente de ejercicio.


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: avesudra en 25 Octubre 2012, 21:26 pm
Debes usar los tipos definidos en:
Código
  1. #include <stdint.h>
Y los especificadores de formato definidos en:
Código
  1. #include <inttypes.h>

Aquí una referencia de stdint.h (http://www.cplusplus.com/reference/clibrary/cstdint/)
Aquí una referencia de inttypes.h (http://www-zeuthen.desy.de/apewww/APE/software/nlibc/html/inttypes_8h.html)

Código de ejemplo:
Código
  1. #include <stdint.h>
  2. #include <inttypes.h>
  3. #include <stdio.h>
  4.  
  5. int main( int argc , char **argv)
  6. {
  7.  uint64_t numero = 0;
  8.  printf("Introduzca un numero:");
  9.  
  10.  //Aqu&#237; se usa %llu , por que en la referencia pone.
  11.  //#define SCNu64 'llu'
  12.  //La u es para los sin signo , la i y  la d para los enteros con signo
  13.  scanf("%llu",&numero);
  14.  
  15.  //Aqu&#237; se usa %llu , por que en la referencia pone.
  16.  //#define PRIu64 'llu'
  17.  //La u es para los sin signo , la i y  la d para los enteros con signo
  18.  printf("Tu numero es %llu", numero);
  19.  
  20.  getchar();
  21.  return 0;
  22. }

En la referencia de los especificadores de formato:
  • PRI significa PRINTF, es decir , que eso es para imprimir el numero , que lleve i o d , depende de la que quieras usar.
  • SCN significa SCANF , es decir, que sirve para introducir el numero , y lo mismo que arriba , puedes usar i o d.

Para lo de los archivos , pone esto en el código fuente de inttypes.h :
Código:
00074  *//           The fprintf() macros for signed integers are:
00075  *//           PRIdN   PRIdLEASTN  PRIdFASTN   PRIdMAX  PRIdPTR
00076  *//           PRIiN   PRIiLEASTN  PRIiFASTN   PRIiMAX  PRIiPTR
00077  *//           
00078  *//           The fprintf() macros for unsigned integers are:
00079  *//           PRIoN   PRIoLEASTN  PRIoFASTN   PRIoMAX  PRIoPTR
00080  *//           PRIuN   PRIuLEASTN  PRIuFASTN   PRIuMAX  PRIuPTR
00081  *//           PRIxN   PRIxLEASTN  PRIxFASTN   PRIxMAX  PRIxPTR
00082  *//           PRIXN   PRIXLEASTN  PRIXFASTN   PRIXMAX  PRIXPTR
00083  *//           
00084  *//           The fscanf() macros for signed integers are:
00085  *//           SCNdN   SCNdLEASTN  SCNdFASTN   SCNdMAX  SCNdPTR
00086  *//           SCNiN   SCNiLEASTN  SCNiFASTN   SCNiMAX  SCNiPTR
00087  *//           
00088  *//           The fscanf() macros for unsigned integers are:
00089  *//           SCNoN   SCNoLEASTN  SCNoFASTN   SCNoMAX  SCNoPTR
00090  *//           SCNuN   SCNuLEASTN  SCNuFASTN   SCNuMAX  SCNuPTR
00091  *//           SCNxN   SCNxLEASTN  SCNxFASTN   SCNxMAX  SCNxPTR

Si quieres hacerlo con archivos te dejo este ejemplo:
Código
  1. #include <stdint.h>
  2. #include <inttypes.h>
  3. #include <stdio.h>
  4.  
  5. int main( int argc , char **argv)
  6. {
  7.  uint64_t numero = 0;
  8.  FILE * archivo;
  9.  archivo = fopen("numero.txt","r"); // Abrimos un archivo para leerlo que debe contener el n&#250;mero.
  10.  /*   The fscanf() macros for unsigned integers are:
  11.          SCNoN   SCNoLEASTN  SCNoFASTN   SCNoMAX  SCNoPTR
  12.          SCNuN   SCNuLEASTN  SCNuFASTN   SCNuMAX  SCNuPTR
  13.          SCNxN   SCNxLEASTN  SCNxFASTN   SCNxMAX  SCNxPTR
  14.   */
  15.  //Nosotros vamos a usar SCNu64 , N se sustituye por uno de los numeros de bits.
  16.  fscanf(archivo, "%llu", &numero);
  17.  printf("El numero del archivo es %llu", numero);
  18.  getchar();
  19.  return 0;
  20. }
  21.  

Si necesitas usar más de 64 bits , tendrás que recurrir a una librería externa a las estándares, aunque también es muy portable, es GMP , si quieres compilarla algún día, este verano puse un tutorial que estará rulando por ahí.

¡Un saludo!

PD: tu problema igual era que no utilizabas el especificador de formato correcto.


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: Caster en 25 Octubre 2012, 21:42 pm
El ejercicio que me dices leosansan es de Project Euler si no recuerdo mal, primero prefiero acabar con este porque creo que es bastante facilito y ademas ya lo empece y ya avance un poco, mirare las librerias stdint y inttypes. Muchas gracias por responder

Saludos


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: avesudra en 25 Octubre 2012, 21:49 pm
He modificado el post de arriba y he puesto un ejemplo de código con archivos.

¡Un saludo!


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: Caster en 25 Octubre 2012, 21:51 pm
Con archivos no puedo porque no he leido nada de nada sobre ello, pero muchas gracias de todas formas.

Saludos


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: flony en 30 Octubre 2012, 00:13 am
hola es solo una idea...pero usar string y leer el numero como una cadena seria una opcion, la otra seria usar vectores y leer cada digito del numero..la sulucion es basicamente la misma pero funciona, ya se lo he visto usar a un flaco, si quieres te paso el video donde habla de ese tema


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: cypascal en 30 Octubre 2012, 12:03 pm
Si, yo lo haría usando un vector, de modo que no tengas que llamar a ninguna biblioteca. Por contra, tendrás que implementar las operaciones básica para el tipo de dato que uses.

Un Saludo!


Título: Re: Como almacenar un numero de 10 cifras
Publicado por: Caster en 30 Octubre 2012, 16:48 pm
Era otra opcion que se me habia ocurrido, pero ahora ya lo hice con las librerias y asi me vale y me funciona perfectamente, muchas gracias.

Saludos