Estoy trabajando en un programa en C como parte de Homework en el que tengo que obtener el producto de dos números largos que se toman como cadena de caracteres. por ejemplo: 123456789021 y 132456789098. Como se toma como una cadena, los convertí en int larga larga para la multiplicación. Pero el producto resultante será muy grande (más largo que largo int, supongo). ¿Puede alguien sugerirme un método para realizar esta multiplicación?Multiplicando dos long long ints C
Respuesta
Aquí hay un enfoque: Considere cómo podría multiplicar estos números a mano, en papel. Aplicar este método en C. Usted tendrá que descubrir:
- cómo romper un entero (representado como una cadena) en dígitos
- cómo convertir cada dígito de nuevo a un número entero
0 <= d < 10
- cómo administrar matrices de dígitos (es decir. cuán grande debe hacer los arreglos?)
- cómo escribir el bucle (s) puede que tenga que poner en práctica la multiplicación
- la forma de gestionar la realización de productos de un solo dígito al siguiente
- cómo convertir esos dígitos a caracteres para la salida
generalmente enteros grandes representados como matrices de bytes. Puede ver la implementación de BigInteger de Microsoft en DLR. Creo que han usado algoritmos desarrollados por Knuth
Otro enfoque sería multiplicar los números como float/double y anotar el decimal al mostrar los resultados.
Podría perder mucha precisión haciendo esto. –
Eso no dará una respuesta exacta si hay demasiados dígitos. Puede ser lo suficientemente bueno dependiendo del caso de uso, pero no creo que ese sea el objetivo de la tarea. –
Compruebe esto BigInteger library y very basic sample code de World of Seven.
Si usted está interesado en algunos de mis códigos caseras en C (sólo multiplicación):
////////////////////////////////////////////////////////////////////////////////
Code removed after I checked the home-work tag ;)
///////////////////////////////////////////////////////////////////////////////////////
Esto funciona en algunos de los concursos de programación anteriores había participado;) Pero si usted está buscando todavía algoritmo de multiplicación más rápido que puede implementar Karatsuba algorithm, yo personalmente uso este ahora en el concurso en tiempo real.
(El primero era un enlace a _Mahbub Murshed's _BigInteger class_ (Versión 6.7.28, 30 de julio de 2004), el segundo _was_ de _Mundo de los Siete - Programación competitiva_, incluso si el URL dice "steven"). – greybeard
Oye, mira esto, Me acaba de terminar su día de antaño como parte de mi tarea:
#include<stdio.h>
#include<string.h>
int main()
{
char one[195];
char two[195];
char temp[195];
int a[195],c[195],b[195];
int x,i,j,k,l,p,add;
for(;;)/*determining the larger number...*/
{
printf("Input A:");
gets(one);
printf("Input B:");
gets(two);
k=strlen(one);
l=strlen(two);
if(l>k)
{
strcpy(temp,one);
strcpy(one,two);
strcpy(two,temp);
break;
}
else
{
break;
}
}
k=strlen(one);
l=strlen(two);
for(p=0;p<195;p++)/*assigning all initial values to 0*/
{
a[p]=0;
b[p]=0;
c[p]=0;
}
for(i=0;one[i];i++)/*converting char to integer(note:1,as a character assigned as 49.)*/
{
a[i]=((one[--k])-48);
}
for(i=0;i<two[i];i++)
{
b[i]=((two[--l])-48);
}
for(i=0;i<=strlen(two);i++)/*main algorithm*/
{
add=0;
p=0;
for(j=i;j<=(2*strlen(one)-1);j++)
{
x=c[j]+b[i]*a[p]+add;
c[j]=x%10;
add=x/10;
p++;
}
}
printf("\nMultiplication:");
for(p=(2*strlen(one)-1);p>=0;p--)
{
if(p>strlen(one)&&c[p]==0)
{
continue;
}
printf("%d",c[p]);
}
printf("\n");
}
- 1. Python tipo long vs C 'long long'
- 2. C++: long long int vs. long int vs. int64_t
- 3. unsigned long long vs unsigned long (portabilidad punto de vista)
- 4. cadena de conversión a long long
- 5. equivalente en Java de unsigned long long?
- 6. Especificador de formato de 'long long'
- 7. ¿Hay tipos más grandes que long long int en C++?
- 8. (lldb) Imprimir unsigned long long en hexadecimal
- 9. Divide Long Long Number como porcentaje
- 10. ¿GCC es compatible con long long int?
- 11. Cuadrando n-bit int vs. multiplicando dos n bit ints
- 12. long para HWND (VS8 C++)
- 13. impresión unsigned long long int Tipo Valor Devuelve resultados extraños
- 14. 'long long int' se interpreta como 'long int'. ¿Cómo puedo evitar esto?
- 15. ¿Debo usar long long o int64_t para código portable?
- 16. Cómo convertir 'long long' (o __int64) a __m64
- 17. PostgreSQL Long VACUUM
- 18. Long type 64bit linux
- 19. long int en PHP
- 20. Rails: Long Polling Practices
- 21. mq_receive: message too long
- 22. Java long to binary
- 23. cast Long a BigDecimal
- 24. Flask long routines
- 25. Java long to Mysql
- 26. Bitwise "&" on a long?
- 27. Cómo imprimirf "unsigned long" en C?
- 28. sizeof (long) en 64 bits C++
- 29. C#: Cómo convertir long to ulong
- 30. ¿Diferencia entre long e int en C#?
Y si no fuera por el hecho de que su entrada y salida estaban en la base 10, se podría hacer todo esto de manera más eficiente utilizando base 2^32 (dígitos en un tipo de 64 bits) o base 2^16 (en un tipo de 32 bits) en lugar de base 10. –