Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: flacc en 13 Julio 2012, 20:39 pm



Título: Una duda concatenando un arreglo de enteros[C]
Publicado por: flacc en 13 Julio 2012, 20:39 pm
Hola, ya que tengo un tiempo libre he estado viendo el tema de concatenar enteros desde un arreglo de tipo entero, he escrito este código:

Básicamente tengo 2 contadores que por pereza no reduje a 1  :-*, ahora el funcionamiento se basa en que los decimales son de base 10, cosa que si tengo vector[3] = {1,2,3} una variable contando desde el final y la otra desde el principio:

Citar
resultado = 0;
resultado += 3*(10^0); //donde 0 es la que cuenta desde el principio
resultado = 3
resultado += 2 * (10^1);
resultado = 23;
resultado = 1 * (10^2);
resultado = 123;

la otra parte que ocupa la función es saber cuantos dígitos tiene el elemento numérico del vector con el cual se trabaja, de manera que si es 1 dígito se aumenta en 1 el exponente para seguir elevando, de otra forma le suma a exponente la cantidad de cifras - 1 que corresponde a sumarle el agregado de dígitos que si tuviéramos 1 solo, como decirlo, si tuviéramos 1 dígito el exponente se sumaría en 1, si tuviéramos 2 no tendríamos que sumarle 2 porque como si tenemos 1 se le suma 1 el agregado osea el segundo para que formen 2 es 1... (suena algo enredado lo se, no se me dan mucho las explicaciones  :xD)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int numDigits(int numero);
  6.  
  7. int main()
  8. {
  9.    int vector[5] = {5855, 45, 6, 5, 0}, i, base, exponente, cifras, cifra, n;
  10.  
  11.    //conversion de vector a cifra
  12.    for(i = 4, exponente = 0, base = 10, cifra = 0; i >= 0; i--, exponente++)
  13.    {
  14.        cifras = numDigits(vector[i]);
  15.        n  = pow(base, exponente);
  16.  
  17.        if(cifras > 1)
  18.        {
  19.            exponente += (cifras - 1);
  20.        }
  21.        cifra += (vector[i] * n);
  22.        printf("%d, %d * %d\n",numDigits(n), n, cifra);
  23.    }
  24.    return 0;
  25. }
  26.  
  27. //Funciones
  28.  
  29. //devuelte la cantidad de digitos que tenga una cifra
  30. int numDigits(int numero)
  31. {
  32.    int i = 0;
  33.  
  34.    //conversion a positivo
  35.    if(numero < 0)
  36.    {
  37.        numero *= -1;
  38.    }
  39.  
  40.    //calculo de cifras
  41.    while(numero > 0)
  42.    {
  43.        numero = numero / 10;
  44.        i++;
  45.    }
  46.    return i;
  47. }

Ahora el problema es concatenar los números cuando tenemos mas de 9 dígitos ya que me dan números raros, y aunque pienso que debe ser algún problema de rango numérico no logro ver el error... quizás ustedes le puedan dar un ojo y decirme en que estoy fallando... saludos y gracias


Título: Re: Una duda concatenando un arreglo de enteros[C]
Publicado por: BlackZeroX en 13 Julio 2012, 20:49 pm
Esos exámenes como dan lata... en esta liga se tiene la misma duda.
http://foro.elhacker.net/programacion_cc/operacion_suma_vectores_duda-t366632.15.html

Veamos si te sirve...

Código
  1.  
  2. #include <iostream>
  3. #include <cstdio>
  4.  
  5. using namespace std;
  6.  
  7. inline int lenNum(unsigned int num) {
  8.    char buff[20];
  9.    return sprintf(buff, "%d", num);
  10. }
  11.  
  12. inline unsigned long long joinVector(unsigned int *vector, size_t size) {
  13.    register int mul = 1;
  14.    register unsigned long long ret = 0;
  15.    while(size--) {
  16.        ret += (vector[size] * mul);
  17.        if (size)
  18.            for (register unsigned int i = 1, ln = lenNum(vector[size]); i <= ln; i++)
  19.                mul *= 10;
  20.    }
  21.    return ret;
  22. }
  23.  
  24. int main() {
  25.    unsigned int vector1[5] = {5, 978, 6, 4, 9}, vector2[5] = {65, 9, 12, 66, 45};
  26.    cout << joinVector(vector1, 5) + joinVector(vector2, 5) << endl;
  27.    cin.get();
  28.    return 0;
  29. }
  30.  
  31.  

Dulces Lunas!¡.


Título: Re: Una duda concatenando un arreglo de enteros[C]
Publicado por: dato000 en 13 Julio 2012, 21:00 pm
pues que raro, probe con un arreglo de 10 posiciones, raro.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int numDigits(int numero);
  6.  
  7. int main()
  8. {
  9.  int vector[10] = {8,9,9,7,8,99,5, 1, 2, 3};
  10.  int i, base, exponente, cifras, cifra, n;
  11.  
  12.    for(i=0; i<10; i++)
  13.      printf("%d",vector[i]);
  14.    puts("\n\n");
  15.  
  16.    //conversion de vector a cifra
  17.    for(i = 9, exponente = 0, base = 10, cifra = 0; i >= 0; i--, exponente++)
  18.    {
  19.        cifras = numDigits(vector[i]);
  20.        n  = pow(base, exponente);
  21.  
  22.        if(cifras > 1)
  23.        {
  24.            exponente += (cifras - 1);
  25.        }
  26.        cifra += (vector[i] * n);
  27.        printf("%d, %d * %d\n",numDigits(n), n, cifra);
  28.    }
  29.    return 0;
  30. }
  31.  
  32. //Funciones
  33.  
  34. //devuelte la cantidad de digitos que tenga una cifra
  35. int numDigits(int numero)
  36. {
  37.    int i = 0;
  38.  
  39.    //conversion a positivo
  40.    if(numero < 0)
  41.    {
  42.        numero *= -1;
  43.    }
  44.  
  45.    //calculo de cifras
  46.    while(numero > 0)
  47.    {
  48.        numero = numero / 10;
  49.        i++;
  50.    }
  51.    return i;
  52. }
  53.  

esta fue la salida:
Citar
root@datohost:/home/dato000/Documentos/emacs/ejercicios/enteros# ./ejercicio
89978995123


1, 1 * 3
2, 10 * 23
3, 100 * 123
4, 1000 * 5123
5, 10000 * 995123
7, 1000000 * 8995123
8, 10000000 * 78995123
9, 100000000 * 978995123
10, 1000000000 * 1389060531
0, -2147483648 * 138906053

 :huh: :huh: :huh: :huh: :huh: :huh: que carajos significa ese ultimo??


Título: Re: Una duda concatenando un arreglo de enteros[C]
Publicado por: BlackZeroX en 13 Julio 2012, 21:09 pm
Significa que llegaste al limite de capacidad de tu variable... revisa los limites...

Dulces Lunas!¡.


Título: Re: Una duda concatenando un arreglo de enteros[C]
Publicado por: flacc en 14 Julio 2012, 02:15 am
era eso?, yo probé con long int y no funka


Título: Re: Una duda concatenando un arreglo de enteros[C]
Publicado por: dato000 en 14 Julio 2012, 17:34 pm
Significa que llegaste al limite de capacidad de tu variable... revisa los limites...

Dulces Lunas!¡.

Es un desbordamiento?? es como si en este caso, en un arreglo de 10 posiciones imprimiera el 11 verdad??? quiero tenerlo claro porque estoy hojeando un libro y haciendo unos ejercicios de arreglos y quiero tenerla clara.


Título: Re: Una duda concatenando un arreglo de enteros[C]
Publicado por: flacc en 14 Julio 2012, 20:49 pm
de hecho el algoritmo nunca desborda el arreglo, lo se porque yo mismo lo hice  :xD, lo que pasa es que independiente del tamaño del arreglo el contenido total se cuenta como cifra, y cuando esa cifra tiene mas de 9 0o 10 dígitos me da ese error por eso es que andaba preguntando... no tiene nada que ver con el tamaño del arreglo...saludos


Título: Re: Una duda concatenando un arreglo de enteros[C]
Publicado por: BlackZeroX en 16 Julio 2012, 05:55 am
Prueba a declara cifra con "long long int" y veras la gran diferencia... si la crifra o valor es mayor a el limite que puede alojar este tipo se resetea por así decirlo...

Dulces Lunas!¡.