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
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
Entonces que hago?
Cita de: Caster en 25 Octubre 2012, 19:40 PM
Entonces que hago?
Reedite el post anterior, léelo o cambia simplemente de ejercicio.
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 (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:
#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.
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
He modificado el post de arriba y he puesto un ejemplo de código con archivos.
¡Un saludo!
Con archivos no puedo porque no he leido nada de nada sobre ello, pero muchas gracias de todas formas.
Saludos
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, 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!
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