Como almacenar un numero de 10 cifras

Iniciado por Caster, 25 Octubre 2012, 19:22 PM

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

Caster

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:

int x;
long int x;
long long int x;
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

leosansan

#1
Cita de: Caster en 25 Octubre 2012, 19:22 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,
CitarEl 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

Caster


leosansan

Cita de: Caster en 25 Octubre 2012, 19:40 PM
Entonces que hago?
Reedite el post anterior, léelo o cambia simplemente de ejercicio.

avesudra

#4
Debes usar los tipos definidos en:
#include <stdint.h>
Y los especificadores de formato definidos en:
#include <inttypes.h>

Aquí una referencia de stdint.h
Aquí una referencia de inttypes.h

Código de ejemplo:

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

int main( int argc , char **argv)
{
  uint64_t numero = 0;
  printf("Introduzca un numero:");

  //Aquí se usa %llu , por que en la referencia pone.
  //#define SCNu64 'llu'
  //La u es para los sin signo , la i y  la d para los enteros con signo
  scanf("%llu",&numero);

  //Aquí se usa %llu , por que en la referencia pone.
  //#define PRIu64 'llu'
  //La u es para los sin signo , la i y  la d para los enteros con signo
  printf("Tu numero es %llu", numero);

  getchar();
  return 0;
}


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 :
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:
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

int main( int argc , char **argv)
{
  uint64_t numero = 0;
  FILE * archivo;
  archivo = fopen("numero.txt","r"); // Abrimos un archivo para leerlo que debe contener el número.
  /*   The fscanf() macros for unsigned integers are:
         SCNoN   SCNoLEASTN  SCNoFASTN   SCNoMAX  SCNoPTR
         SCNuN   SCNuLEASTN  SCNuFASTN   SCNuMAX  SCNuPTR
         SCNxN   SCNxLEASTN  SCNxFASTN   SCNxMAX  SCNxPTR
  */
  //Nosotros vamos a usar SCNu64 , N se sustituye por uno de los numeros de bits.
  fscanf(archivo, "%llu", &numero);
  printf("El numero del archivo es %llu", numero);
  getchar();
  return 0;
}


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.
Regístrate en

Caster

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

avesudra

He modificado el post de arriba y he puesto un ejemplo de código con archivos.

¡Un saludo!
Regístrate en

Caster

Con archivos no puedo porque no he leido nada de nada sobre ello, pero muchas gracias de todas formas.

Saludos

flony

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
si un problema no tiene solucion entonces no es un problema...es algo inevitable

cypascal

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!
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES