Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 29 Septiembre 2014, 00:09 am



Título: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: NOB2014 en 29 Septiembre 2014, 00:09 am
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:
Código
  1. 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:
Código
  1. char a[] = "2147483647", b[] = "2";
  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   


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: ivancea96 en 29 Septiembre 2014, 00:11 am
Puedes hacerlo byte a byte.
O hacer la multiplicación como un bucle de sumas.


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: NOB2014 en 29 Septiembre 2014, 00:26 am
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   


Título: Re:
Publicado por: ivancea96 en 29 Septiembre 2014, 00:41 am
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)


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: NOB2014 en 30 Septiembre 2014, 04:22 am
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.-

Código
  1. #include<stdio.h>
  2.  
  3. int main(void){
  4. char a[] = "214", b[] = "3", resultadoChar[3];
  5. int i, j, resultadoInt=0, resto=0, operUno=0, operDos=0;
  6. for(i=2; i>=0; i--, j++){
  7. operUno = a[i] - '0';
  8. operDos = b[0] - '0';
  9. resultadoInt = (operUno * operDos) + resto;
  10. resto = 0;
  11. if(resultadoInt > 9){
  12. resultadoInt -= 10;
  13. resto++;
  14. }
  15. //copiar resultadoInt en resultadoChar[j];
  16. }
  17.  
  18. for(i=0; i<3; i++){
  19. printf("%c", resultadoChar[i]);
  20. }
  21.  
  22. return 0;
  23. }

Saludos.
Daniel  


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: Blaster en 30 Septiembre 2014, 21:39 pm
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
  1. int main(void)
  2. {
  3.    char a[] = "914", b[] = "3", mult[4];
  4.    int i, j, result = 0, resto = 0, operUno = 0, operDos = 0;
  5.  
  6.    for(i = j = 2; i >= 0; i--, j--)
  7.    {
  8.        operUno = a[i] - '0', operDos = b[0] - '0';
  9.        result = operUno * operDos + resto;
  10.        if (result >= 10)
  11.        {
  12.            resto = result / 10;
  13.            result -= resto * 10;
  14.        }
  15.        else
  16.            resto = 0;
  17.        mult[j] = result;
  18.    }
  19.    if (resto)
  20.    {
  21.        for( i = 3; i > 0; i--)
  22.            mult[i] = mult[i - 1];
  23.        mult[0] = resto;
  24.    }
  25.    for(i = 0; i < 4 ; i++)
  26.        printf("%d", mult[i]);
  27.  
  28.    return 0;
  29. }
  30.  

Un saludo


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: NOB2014 en 1 Octubre 2014, 00:33 am
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.-
 
Código
  1. #include<stdio.h>
  2.  
  3. int main(void){
  4. char a[] = "4294967295", b[] = "2", mult[11];
  5. int i, j, result = 0, resto = 0, operUno = 0, operDos = 0;
  6.  
  7. for(i = j = 10; i >= 0; i--, j--){
  8. operUno = a[i] - '0', operDos = b[0] - '0';
  9. result = operUno * operDos + resto;
  10. if (result >= 10){
  11. resto = result / 10;
  12. result -= resto * 10;
  13. }
  14. else
  15. resto = 0;
  16. mult[j] = result;
  17.    }
  18. if(resto){
  19. for( i = 10; i > 0; i--)
  20. mult[i] = mult[i - 1];
  21. mult[0] = resto;
  22. }
  23. for(i = 0,j = 10; i < 10 ; i++, j--)
  24. if(j % 3 == 0)
  25. printf(".%d", mult[i]);
  26. else
  27. printf("%d", mult[i]);
  28.  
  29. return 0;
  30. }

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   


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: T. Collins en 1 Octubre 2014, 00:57 am
http://www.cquestions.com/2010/08/multiplication-of-large-numbers-in-c.html


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: NOB2014 en 1 Octubre 2014, 04:18 am
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   


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: Blaster en 1 Octubre 2014, 05:02 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


Título: Re: Multiplicar 2 cedenas y poner el resultado en otra cadena (lenguaje C)
Publicado por: Shout en 1 Octubre 2014, 18:32 pm
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
Si el inglés no es tu fuerte, te va a ser duro aprender a programar. Muchos recursos importantes están sólo en inglés, o son muy difíciles de encontrar en español.