Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: maic1020 en 10 Noviembre 2016, 23:57 pm



Título: Tengo una duda con un programa que hice en C
Publicado por: maic1020 en 10 Noviembre 2016, 23:57 pm
Este es el enunciado del ejercicio:

Escribe un programa que dado un número entero positivo, indique si
contiene una secuencia apocalíptica. Un número contiene una secuencia
apocalíptica si tiene al menos tres veces seguidas la cifra 6.
Por ejemplo: 666, 46 663, 23666997.

y este es el programa que hice:

Código
  1. #include <stdio.h>
  2. int main(){
  3. int n,cont=0,r;
  4. printf("Escribe un numero: "); scanf("%d",&n);
  5. while(n>0 && cont<3){
  6.    if(n%10==6){ // si el numero divido 10 da como residuo 6
  7.        n=n/10;      // calculo el cociente
  8.        if(n%10==6){ // el numero adopta el valor del cociente
  9.            n=n/10; // realizo lo mismo que el anterio (cociente)
  10.            r=n%10; // calculo el reciduo
  11.            if(n%10==6 || r==6 ){ se han de cumplir uno de las dos condiciones
  12.                cont+=3;// constante  que almacena un 3, es decir, almacena tres veces              seguidas el numero 6
  13.            }
  14.        }
  15.    }
  16.  
  17.      if(n%10!=6){
  18.         n=n/10;
  19.      }
  20. }
  21. if(cont>=3)
  22.   printf("El numero es apocaliptico\n");
  23. else
  24.   printf("El numero no es apocaliptico\n");
  25.  
  26. return 0;}
  27.  
todo iba bien, me reconocia lo que pedia, lo malo es cuando ingreso una cantidad elevada de numeros, por ejemplo "6669850943 o 666666666", me gustaria que me dijierais alguna solucion, os lo agradeceria.



Mod: Los códigos deben ir en etiquetas GeSHi, no se debe escribir en mayúsculas


Título: Re: Tengo una duda con un programa que hice en C
Publicado por: Poyoncio en 11 Noviembre 2016, 00:57 am
Declara con float, en vez de con int


Título: Re: Tengo una duda con un programa que hice en C
Publicado por: andie13 en 11 Noviembre 2016, 01:03 am
Si no me equivoco las variables int solo captan hasta un máximo de 2.147.483.647 numeros en 32 bits.
He probado y cuando pones un numero infimamente menos que ese máximo, el programa funciona.
Código
  1. Escribe un numero: 2146662132
  2. El numero es apocaliptico
Es a partir de ahí cuando empieza a fallar.
Código
  1. Escribe un numero: 2147666548
  2. El numero no es apocaliptico
Prueba cambiando la variable int por otra que soporte mayor cantidad de caracteres, como float.


Título: Re: Tengo una duda con un programa que hice en C
Publicado por: MAFUS en 11 Noviembre 2016, 07:02 am
Usa unsigned, long int, long unsigned, long long int, long ling unsigned.


Título: Re: Tengo una duda con un programa que hice en C
Publicado por: engel lex en 11 Noviembre 2016, 07:18 am
Si no me equivoco las variables int solo captan hasta un máximo de 2.147.483.647 numeros en 32 bits.
He probado y cuando pones un numero infimamente menos que ese máximo, el programa funciona.
Código
  1. Escribe un numero: 2146662132
  2. El numero es apocaliptico
Es a partir de ahí cuando empieza a fallar.
Código
  1. Escribe un numero: 2147666548
  2. El numero no es apocaliptico
Prueba cambiando la variable int por otra que soporte mayor cantidad de caracteres, como float.

float es 32bits... puedes incluso guardar menos(por el calculo de la parte decimal)... lo unico que hace es mover el espacio decimal para "ajustar la precisión"

recomiendo estudiar los detalles
https://en.wikipedia.org/wiki/Single-precision_floating-point_format (https://en.wikipedia.org/wiki/Single-precision_floating-point_format)

y dejo la aclaratoria
Citar
As an example, the 32-bit integer 2,147,483,647 converts to 2,147,483,650 in IEEE 754 form.


en tal caso si te fijas el 2.147..... es 31 bits... el 32 es el signo, por lo que si usas (como indica MAFUS) unsigned int, llegarás hasta 4.294...

si usas unsigned long int, tendrás un espacio de 64 bits, que es un numero mucho más grande (18.446.744.073.709.551.616), igual limitado para "rellenar", de ahí en adelante no puedes acceder a numero de mayor precisión sin librerías especiales