Una duda concatenando un arreglo de enteros[C]

Iniciado por flacc, 13 Julio 2012, 20:39 PM

0 Miembros y 1 Visitante están viendo este tema.

flacc

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:

Citarresultado = 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)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int numDigits(int numero);

int main()
{
    int vector[5] = {5855, 45, 6, 5, 0}, i, base, exponente, cifras, cifra, n;

    //conversion de vector a cifra
    for(i = 4, exponente = 0, base = 10, cifra = 0; i >= 0; i--, exponente++)
    {
        cifras = numDigits(vector[i]);
        n  = pow(base, exponente);

        if(cifras > 1)
        {
            exponente += (cifras - 1);
        }
        cifra += (vector[i] * n);
        printf("%d, %d * %d\n",numDigits(n), n, cifra);
    }
    return 0;
}

//Funciones

//devuelte la cantidad de digitos que tenga una cifra
int numDigits(int numero)
{
    int i = 0;

    //conversion a positivo
    if(numero < 0)
    {
        numero *= -1;
    }

    //calculo de cifras
    while(numero > 0)
    {
        numero = numero / 10;
        i++;
    }
    return i;
}


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

BlackZeroX

#1
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 (cpp) [Seleccionar]


#include <iostream>
#include <cstdio>

using namespace std;

inline int lenNum(unsigned int num) {
   char buff[20];
   return sprintf(buff, "%d", num);
}

inline unsigned long long joinVector(unsigned int *vector, size_t size) {
   register int mul = 1;
   register unsigned long long ret = 0;
   while(size--) {
       ret += (vector[size] * mul);
       if (size)
           for (register unsigned int i = 1, ln = lenNum(vector[size]); i <= ln; i++)
               mul *= 10;
   }
   return ret;
}

int main() {
   unsigned int vector1[5] = {5, 978, 6, 4, 9}, vector2[5] = {65, 9, 12, 66, 45};
   cout << joinVector(vector1, 5) + joinVector(vector2, 5) << endl;
   cin.get();
   return 0;
}



Dulces Lunas!¡.
The Dark Shadow is my passion.

dato000

pues que raro, probe con un arreglo de 10 posiciones, raro.


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int numDigits(int numero);

int main()
{
  int vector[10] = {8,9,9,7,8,99,5, 1, 2, 3};
  int i, base, exponente, cifras, cifra, n;

    for(i=0; i<10; i++)
      printf("%d",vector[i]);
    puts("\n\n");

    //conversion de vector a cifra
    for(i = 9, exponente = 0, base = 10, cifra = 0; i >= 0; i--, exponente++)
    {
        cifras = numDigits(vector[i]);
        n  = pow(base, exponente);

        if(cifras > 1)
        {
            exponente += (cifras - 1);
        }
        cifra += (vector[i] * n);
        printf("%d, %d * %d\n",numDigits(n), n, cifra);
    }
    return 0;
}

//Funciones

//devuelte la cantidad de digitos que tenga una cifra
int numDigits(int numero)
{
    int i = 0;

    //conversion a positivo
    if(numero < 0)
    {
        numero *= -1;
    }

    //calculo de cifras
    while(numero > 0)
    {
        numero = numero / 10;
        i++;
    }
    return i;
}


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??



BlackZeroX

Significa que llegaste al limite de capacidad de tu variable... revisa los limites...

Dulces Lunas!¡.
The Dark Shadow is my passion.

flacc

era eso?, yo probé con long int y no funka

dato000

Cita de: BlackZeroX (Astaroth) en 13 Julio 2012, 21:09 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.



flacc

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

BlackZeroX

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!¡.
The Dark Shadow is my passion.