2009-12-06 49 views
5

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

16

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
+2

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. –

0

Puede usar una biblioteca para un entero grande arithmetik, Wikipedia tiene una lista here.

+3

Aunque las bibliotecas de números grandes a menudo son útiles, creo que iría en contra del pensamiento y el propósito detrás del problema. – Inisheer

1

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

0

Otro enfoque sería multiplicar los números como float/double y anotar el decimal al mostrar los resultados.

+3

Podría perder mucha precisión haciendo esto. –

+0

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. –

1

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.

+0

(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

1

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"); 
}