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
Puedes hacerlo byte a byte.
O hacer la multiplicación como un bucle de sumas.
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
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)
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
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 :
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
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
http://www.cquestions.com/2010/08/multiplication-of-large-numbers-in-c.html
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
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
Cita de: 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
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.