Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Miguelito en 4 Mayo 2019, 19:11 pm



Título: Separar un numero de 16 digitos
Publicado por: Miguelito en 4 Mayo 2019, 19:11 pm
Buenas a todos, tengo un dilema con una tarea en la cual me piden ingresar un numero que puede estar entre 13 y 16 digitos el cual tengo que separar sus digitos e ingresarlos a una matriz, luego tengo que multiplicar por 2 los digitos separados empezando desde el penultimo digito y saltandome de a dos.

ej: 1234567891234567
     1  2  3  4  5  6  7  8  9  1  2  3  4  5  6  7
     2  2  6  4 10 6 14 8 18 1   4  3  8  5 12 7

y luego sumarlos.
Mi duda es que si ingreso un numero menor a 16 digitos los ultimos digitos quedaran en 0 y no se como ubicarme en el penultimo digito.

ej: 1234567891234
     1  2  3  4  5  6  7  8  9  1  2  3  4  0  0  0
     2  2  6  4 10 6 14 8 18  1  4  3  8  0  0  0
en este caso empieza a multiplicar desde el ultimo termino, como hago para que omita los primeros 0?


Código:
#include<stdio.h>
int main () {
char digit[16];
int i, j;
for(i=0; i<=15; i++){
digit[i]=0;
}
printf("Ingrese el numero de tarjeta: ");
scanf("%s", digit);

for(i=0; i<=15; i++){
                 printf("%c\n", digit[i]);
}
return 0;
}


Título: Re: Separar un numero de 16 digitos
Publicado por: K-YreX en 4 Mayo 2019, 19:24 pm
Hay muchas formas de resolver esto, yo te voy a comentar una posible solución.
Te recomiendo leer el número en una variable de tipo <long long> porque en un <int> no cabe un número de 16 dígitos y después ir guardando cada dígito en un array ya que tal como lo haces en esa cadena podrías escribir cualquier cosa y tener problemas en la ejecución.
Además separar un número en dígitos es un problema muy común cuando empiezas en programación y que viene bien que lo practiques ya que es muy útil.
Una vez guardado el número, si creas un array de memoria estática de tamaño 16 siempre (quiero decir, que no usas memoria dinámica) empieza a guardar los dígitos por el final y así podrás localizar siempre la penúltima posición ya que los 0 estarán al principio, no al final.

Suerte :-X


Título: Re: Separar un numero de 16 digitos
Publicado por: Miguelito en 4 Mayo 2019, 23:42 pm
Hay muchas formas de resolver esto, yo te voy a comentar una posible solución.
Te recomiendo leer el número en una variable de tipo <long long> porque en un <int> no cabe un número de 16 dígitos y después ir guardando cada dígito en un array ya que tal como lo haces en esa cadena podrías escribir cualquier cosa y tener problemas en la ejecución.
Además separar un número en dígitos es un problema muy común cuando empiezas en programación y que viene bien que lo practiques ya que es muy útil.
Una vez guardado el número, si creas un array de memoria estática de tamaño 16 siempre (quiero decir, que no usas memoria dinámica) empieza a guardar los dígitos por el final y así podrás localizar siempre la penúltima posición ya que los 0 estarán al principio, no al final.

Suerte :-X

Gracias, tenia problemas con el long por que no usaba el %ld en el scanf solamente ponia %d por eso habia abandonado ese metodo pero ya lo logre.
Todavia no termino el programa pero lo dejare por aqui por si alguien le puede servir.

Código
  1. #include<stdio.h>
  2. int main (){
  3. long long int num;
  4. int i, c, n;
  5. int mat[16];
  6.  
  7. printf("Ingrese su numero de tarjeta: ");
  8. scanf("%lld", &num);
  9. // printf("%lld", num);
  10.  
  11. for(i=15; i>=0; i--){
  12. printf("num entrada %lld\n", num);
  13. n = num%10;
  14. printf("el numero es: %d \n", n);
  15. mat[i] = n;
  16. num = num - n;
  17. num = num/10;
  18. printf("num salida %lld\n", num);
  19. }
  20.  
  21. for (i=0; i<=15; i++){
  22. printf("%d", mat[i]);
  23. }
  24. }


Título: Re: Separar un numero de 16 digitos
Publicado por: K-YreX en 5 Mayo 2019, 01:58 am
Ese código se puede optimizar un poco. Te dejo aquí un código que guarda cada dígito en una posición del array.
Como estamos usando números enteros, no hace falta restarle la última cifra al número ya que el operador de división / realiza una división entre enteros por lo que obvia los decimales.
Además es recomendable que uses nombres de variables que expliquen mejor su uso.
Código
  1. int main(){
  2.    int digitos[MAX_CIFRAS] = {0};
  3.    long long numero;
  4.    for(size_t i = MAX_CIFRAS-1; i >= 0; --i){
  5.        digitos[i] = numero%10;
  6.        numero /= 10;
  7.    }
  8. }