Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)

Iniciado por NOB2014, 29 Septiembre 2014, 00:09 AM

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

NOB2014

Hola y que tengan un muy buen día.
Como verán me estoy poniendo un poco pesado pero prometo que después de esto y por un tiempo voy a exponer mis dudas en otro foro, prometido.-
Al grano, esta operación no es factible en c:
unsigned a = 2147483648, b = 2, c = a * b; 
Tengo conocimiento de las variable con más capacidad pero no importa en este caso, lo que quiero hacer es multiplicaciones realmente grandes y para ello quiero hacerlo con 2 variables char, también sé que esto si se puede hacer:
char a[] = "2147483647", b[] = "2";
unsigned int c = atoi(a) * atoi(b);

pero me limita al valor máximo que puede contener una variable unsigned int.-
Alguien sabe de alguna curiosidad matemática, algo a nivel de bist, algo que me dé el inicio para multiplicar 2 números alojados en variables char y poner el resultado  en otra del mismo tipo?, Cualquier ayuda será bien venida.-

Saludos.
Daniel   
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96

Puedes hacerlo byte a byte.
O hacer la multiplicación como un bucle de sumas.

NOB2014

Hola ivancea96.
Por lo que tengo visto no te debe gustar postear códigos por lo menos en los que yo te he leído parece una constante, podrías ponerme algún ejemplo con código (una acepción) o un poco más de teoría.-
Desde ya muchas gracias.-


Saludos.
Daniel   
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96

No posteo código, porque opino que con el concepto basta ^^
En cualquier caso, ahora estoy en el móvil.
Para lo que dije, lo primero es sumar cadenas. Eso se hace, como si fuera una suma en papel. "Sumas un número con el otro, y si es mayor de 9, le restas 10, y te llevas una."
Y así caracter a caracter, empezando desde la derecha. Cabe decir, que hay que tener cuidado con colocarle un tamaño correcto al char* de salida. (No se vaya a hacer char[-1] o algo del estilo)

NOB2014

#4
Hola a todos.
Gracias a ivancea96 pude arrancar con la idea, es obvio que me faltan un montón de detalles, pero lo que me trae en este momento y sin ello no puedo seguir es que sintaxis debo utilizar para copiar resultadoInt en resultadoChar[j] y si me pudieran decir si estoy bien rumbeado.-

#include<stdio.h>

int main(void){
char a[] = "214", b[] = "3", resultadoChar[3];
int i, j, resultadoInt=0, resto=0, operUno=0, operDos=0;
for(i=2; i>=0; i--, j++){
operUno = a[i] - '0';
operDos = b[0] - '0';
resultadoInt = (operUno * operDos) + resto;
resto = 0;
if(resultadoInt > 9){
resultadoInt -= 10;
resto++;
}
//copiar resultadoInt en resultadoChar[j];
}

for(i=0; i<3; i++){
printf("%c", resultadoChar[i]);
}

return 0;
}


Saludos.
Daniel  
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Blaster

Cita de: NOB2014 en 30 Septiembre 2014, 04:22 AM
pero lo que me trae en este momento y sin ello no puedo seguir es que sintaxis debo utilizar para copiar resultadoInt en resultadoChar[j] y si me pudieran decir si estoy bien rumbeado.-

Inicializar j a 2 para ir almacenando el resultado en la ultima posición del array  e ir decrementandolo sucesivamente, te dejo el código con todas las correcciones en especial la parte de acarreo que no tomaba algunos casos :

Código (cpp) [Seleccionar]
int main(void)
{
    char a[] = "914", b[] = "3", mult[4];
    int i, j, result = 0, resto = 0, operUno = 0, operDos = 0;

    for(i = j = 2; i >= 0; i--, j--)
    {
        operUno = a[i] - '0', operDos = b[0] - '0';
        result = operUno * operDos + resto;
        if (result >= 10)
        {
            resto = result / 10;
            result -= resto * 10;
        }
        else
            resto = 0;
        mult[j] = result;
    }
    if (resto)
    {
        for( i = 3; i > 0; i--)
            mult[i] = mult[i - 1];
        mult[0] = resto;
    }
    for(i = 0; i < 4 ; i++)
        printf("%d", mult[i]);

    return 0;
}


Un saludo

NOB2014

Hola Blaster.
Genial amigo gracias funciona perfecto, pero ahora necesito algo más, hay alguna fórmula matemática para establecer las cifras totales que tendrá el resultado de una multiplicación.-
Por ejemplo el programa siguiente tuve que hacer la cuenta en un papel para establecer los elementos de mult[11] y otra cosita, que asegura que el último elemento de multi tendrá el '\0' no encuentro esa parte.-

#include<stdio.h>

int main(void){
char a[] = "4294967295", b[] = "2", mult[11];
int i, j, result = 0, resto = 0, operUno = 0, operDos = 0;

for(i = j = 10; i >= 0; i--, j--){
operUno = a[i] - '0', operDos = b[0] - '0';
result = operUno * operDos + resto;
if (result >= 10){
resto = result / 10;
result -= resto * 10;
}
else
resto = 0;
mult[j] = result;
    }
if(resto){
for( i = 10; i > 0; i--)
mult[i] = mult[i - 1];
mult[0] = resto;
}
for(i = 0,j = 10; i < 10 ; i++, j--)
if(j % 3 == 0)
printf(".%d", mult[i]);
else
printf("%d", mult[i]);

return 0;
}


Lo último que hice es para que quedara más paquete, lo que pasa es que  con 9 cifras el resultado me lo muestra así .000.000.000, luego lo arreglo.-       

Saludos.
Daniel   
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-


NOB2014

Hola Blaster.
Le encontré 2 cosas que se deben cambiar.
Si el operando más a la izquierda tiene menos cifras que el de la derecha, el resultado es erróneo.
456 x 1234
La otra, si el operando más a la derecha tiene más de una cifra, el resultado también falla.-   
456 x 12
T. Collins gracias por colaborar, el inglés no es mi fuerte.-
Bueno seguiré picando código para ver si lo logro.-

Saludos.
Daniel   
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Blaster

Cita de: NOB2014 en  1 Octubre 2014, 04:18 AM
Le encontré 2 cosas que se deben cambiar.
Si el operando más a la izquierda tiene menos cifras que el de la derecha, el resultado es erróneo.
456 x 1234
La otra, si el operando más a la derecha tiene más de una cifra, el resultado también falla.-   
456 x 12

Claro yo solo seguí la lógica de tu código asumiendo que el multiplicador seria no mas de un dígito para encarar operaciones del tipo que expones se tendría que hacer importantes modificaciones al código; quedaría un poco mas extenso y complejo

Un Saludo NOB2014