elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Manejar valores más altos que los de un int
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Manejar valores más altos que los de un int  (Leído 1,569 veces)
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Manejar valores más altos que los de un int
« en: 7 Noviembre 2012, 01:27 »

Hola buenas, necesito en un programa manejar valores más altos que los máximos de los int (ya sabéis, 2^31 - 1). Más concretamente, necesito manejar valores entre 1.000.000 y 9.999.999.

Cuando en el programa meto, por ejemplo, una unidad más del valor máximo (2^31), el programa lo toma como negativo, y no funciona como debería. Lo he intentado con otros tipos de datos, unsigned, long, etc. pero no consigo solucionarlo. Lo raro es que con algunos de los valores que superan ese máximo sí funciona el programa, y con otros no.

El código de ese programa os lo pongo a continuación; en otro necesito también valores altos (para calcular factoriales de números relativamente altos).

Para que entendáis el sentido del programa, os pongo la condición para que el número sea válido.
Citar
Suponer que los numero de las cuentas corrientes son de 10 dígitos. El ultimo digito de la suma de los primeros 9 dígitos debe de ser el mismo que el decimo digito.

Código
  1. #include <stdio.h>
  2.  
  3. //Definición de funciones
  4.  
  5. int cantidadDigitos(int num);
  6. int sumaDigitos(int num);
  7. int ultimoDigito(int num);
  8. void comprobaciones(int numero);
  9.  
  10. //Cuerpo del programa
  11.  
  12. int main()
  13. {
  14.   int numero;   //Número de tarjeta de crédito
  15.  
  16.   printf("Mete el numero de la tarjeta de credito: ");
  17.  
  18.   //Hasta meter un número positibo, no saldrá del bucle
  19.   do{
  20.      scanf("%i", &numero);
  21.      if(numero < 0)
  22.      {
  23.         printf("\nEl numero tiene que ser positibo! Metelo otra vez: ");
  24.      }
  25.   }while(numero < 0);
  26.  
  27.   comprobaciones(numero);
  28.  
  29.   printf("\nIntro para salir...");
  30.   fflush(stdin);
  31.   getchar();
  32.  
  33.   return 0;
  34. }
  35.  
  36. int cantidadDigitos(int num)
  37. {
  38.   int i = 0;            //Para contar el número de dígitos
  39.   int numAux = num;      //Variable auxiliar
  40.  
  41.   while(numAux > 0)      //Hasta que no sea 0...
  42.   {
  43.      numAux /= 10;      //...pasamos al siguiente dígito
  44.      i++;            //...y un dígito más que tenemos
  45.   }
  46.  
  47.   return i;
  48. }
  49.  
  50. int sumaDigitos(int num)
  51. {
  52.   int suma = 0;            //para guardar la suma entre los 9 primeros digitos del numero de la tarjeta
  53.   int divisor = 1000000000;   //Para sacar los dígitos de uno en uno, empezando por el más significativo
  54.   int resto = num;         //auxiliar, para avanzar de dígito en dígito
  55.   int ultimo_digito = 0;         //Batuketaren azken digitua gordeko duen aldagaia
  56.   int i;                     //Buklerako
  57.  
  58.   for(i=0; i<9; i++)
  59.   {
  60.      suma += (resto/divisor);      //la suma entre los dígitos
  61.      resto = resto % divisor;      //pasamos al siguiente dígito
  62.      divisor /= 10;                  //y para sacar el siguiente digito
  63.   }
  64.  
  65.   ultimo_digito = ultimoDigito(suma);      //El último dígito de la suma
  66.  
  67.   return ultimo_digito;
  68. }
  69.  
  70. int ultimoDigito(int num)
  71. {
  72.   int digito = 0;
  73.  
  74.   digito = num % 10;
  75.  
  76.   return digito;
  77. }
  78.  
  79. void comprobaciones(int numero)
  80. {
  81.   int cantidad = 0;
  82.   int suma_digitos = 0;
  83.  
  84.   //Calculamos en número de dígitos
  85.   cantidad = cantidadDigitos(numero);
  86.  
  87.   //Si la cantidad de dígitos es correcta (10)
  88.   if(cantidad == 10)
  89.   {
  90.      printf("\nLa cantidad de digitos es correcta.\n");
  91.  
  92.      //Si el último dígito de la suma de los primeros 9 dígitos es igual al último dígito de la tarjeta:
  93.      if(sumaDigitos(numero) == ultimoDigito(numero))
  94.      {
  95.         printf("\nSe cumplen las condiciones.\n");
  96.      }
  97.      else
  98.      {
  99.         printf("\nEl numero de tarjeta de credito no cumple las condiciones.\n");
  100.      }
  101.   }
  102.   //Si el número de dígitos no es el correcto
  103.   else
  104.   {
  105.      printf("\nEl numero de digitos no es el adecuado.\n");
  106.   }
  107. }


En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Manejar valores más altos que los de un int
« Respuesta #1 en: 7 Noviembre 2012, 04:55 »

Y con unsigned long long ?


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Manejar valores más altos que los de un int
« Respuesta #2 en: 7 Noviembre 2012, 05:47 »

Hola buenas, necesito en un programa manejar valores más altos que los máximos de los int (ya sabéis, 2^31 - 1). Más concretamente, necesito manejar valores entre 1.000.000 y 9.999.999.
Citar
Puedes usar la libreria de C: #include <inttypes.h>. En ella el entero en lugar de ser int es uint64_t y el formato %llu, en lugar de %d:
Código
  1. #include <stdio.h>
  2. #include <inttypes.h>
  3. //Definición de funciones
  4.  
  5. int cantidadDigitos(int num);
  6. int sumaDigitos(int num);
  7. int ultimoDigito(int num);
  8. void comprobaciones(int numero);
  9.  
  10. //Cuerpo del programa
  11.  
  12. int main()
  13. {
  14.      //Número de tarjeta de crédito
  15.    uint64_t numero;
  16.   printf("Mete el numero de la tarjeta de credito: ");
  17.  
  18.   //Hasta meter un número positibo, no saldrá del bucle
  19.   do{
  20.      scanf("%llu", &numero);
  21.      if(numero < 0)
  22.      {
  23.         printf("\nEl numero tiene que ser positibo! Metelo otra vez: ");
  24.      }
  25.   }while(numero < 0);
  26.  
  27.   comprobaciones(numero);
  28.  
  29.   printf("\nIntro para salir...");
  30.   fflush(stdin);
  31.   getchar();
  32.  
  33.   return 0;
  34. }
  35.  
  36. int cantidadDigitos(int num)
  37. {
  38.   int i = 0;            //Para contar el número de dígitos
  39.   int numAux = num;      //Variable auxiliar
  40.  
  41.   while(numAux > 0)      //Hasta que no sea 0...
  42.   {
  43.      numAux /= 10;      //...pasamos al siguiente dígito
  44.      i++;            //...y un dígito más que tenemos
  45.   }
  46.  
  47.   return i;
  48. }
  49.  
  50. int sumaDigitos(int num)
  51. {
  52.   int suma = 0;            //para guardar la suma entre los 9 primeros digitos del numero de la tarjeta
  53.   int divisor = 1000000000;   //Para sacar los dígitos de uno en uno, empezando por el más significativo
  54.   int resto = num;         //auxiliar, para avanzar de dígito en dígito
  55.   int ultimo_digito = 0;         //Batuketaren azken digitua gordeko duen aldagaia
  56.   int i;                     //Buklerako
  57.  
  58.   for(i=0; i<9; i++)
  59.   {
  60.      suma += (resto/divisor);      //la suma entre los dígitos
  61.      resto = resto % divisor;      //pasamos al siguiente dígito
  62.      divisor /= 10;                  //y para sacar el siguiente digito
  63.   }
  64.  
  65.   ultimo_digito = ultimoDigito(suma);      //El último dígito de la suma
  66.  
  67.   return ultimo_digito;
  68. }
  69.  
  70. int ultimoDigito(int num)
  71. {
  72.   int digito = 0;
  73.  
  74.   digito = num % 10;
  75.  
  76.   return digito;
  77. }
  78.  
  79. void comprobaciones(int numero)
  80. {
  81.   int cantidad = 0;
  82.   int suma_digitos = 0;
  83.  
  84.   //Calculamos en número de dígitos
  85.   cantidad = cantidadDigitos(numero);
  86.  
  87.   //Si la cantidad de dígitos es correcta (10)
  88.   if(cantidad == 10)
  89.   {
  90.      printf("\nLa cantidad de digitos es correcta.\n");
  91.  
  92.      //Si el último dígito de la suma de los primeros 9 dígitos es igual al último dígito de la tarjeta:
  93.      if(sumaDigitos(numero) == ultimoDigito(numero))
  94.      {
  95.         printf("\nSe cumplen las condiciones.\n");
  96.      }
  97.      else
  98.      {
  99.         printf("\nEl numero de tarjeta de credito no cumple las condiciones.\n");
  100.      }
  101.   }
  102.   //Si el número de dígitos no es el correcto
  103.   else
  104.   {
  105.      printf("\nEl numero de digitos no es el adecuado.\n");
  106.   }
  107. }
Saludos!.
En línea

Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Manejar valores más altos que los de un int
« Respuesta #3 en: 8 Noviembre 2012, 18:31 »

Utiliza las librerias "stdint.h" y "inttypes".

http://www.cplusplus.com/reference/clibrary/cstdint/

El formato, como dice leosansan mas arriba, es %llu, tanto para printf como para scanf.

Saludos
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Manejar valores más altos que los de un int
« Respuesta #4 en: 8 Noviembre 2012, 19:02 »

@leosansan, positivo con b: me duelen los ojos!
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Manejar valores más altos que los de un int
« Respuesta #5 en: 8 Noviembre 2012, 19:03 »

@leosansan, positivo con b: me duelen los ojos!

Lo ha copiado, el que escribio eso fue el que creo el post
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines