2009-12-06 102 views
5

我正在研究C中的一個程序,作爲家庭作業的一部分,在這個程序中我必須得到兩個長字符作爲字符串的乘積。例如:123456789021和132456789098.由於它被視爲一個字符串,我將它們轉換爲long long int來進行乘法運算。但是由此產生的產品將會非常大(我猜大於long long int)。任何人都可以請建議我一種方法來執行這種乘法?乘以兩個長整數C

回答

16

這裏有一種方法:考慮如何在紙上手工乘以這些數字。實施C.這種方法,你必須發現:

  • 如何打破了一個整數(表示爲字符串)成數字
  • 如何每個數字轉換回一個整數0 <= d < 10
  • 如何管理的數字陣列(即有多大,你應該做的陣列?)
  • 如何編寫循環(一個或多個),你可能需要實現乘法
  • 如何管理攜帶來自一個數字產品到下一個
  • 如何將這些數字轉換爲字符以便輸出
+2

如果它不是一個事實,即你的輸入和輸出都在基地10,你可以通過使用基數2^32(數字保持在64位類型)或基數2^16(以32位類型)而不是基數10來更有效地完成所有這些操作。 – 2009-12-06 23:10:48

0

您可以使用大型整數庫arithmetik,Wikipedia有一個列表here

+3

儘管大數量的庫通常是有幫助的,但我相信它會違背問題背後的思想和目的。 – Inisheer 2009-12-06 19:24:55

1

通常以字節數組表示的大整數。您可以在DLR中查看Microsoft的BigInteger實現。我認爲他們已經使用Knuth開發的算法

0

另一種方法是將數字乘以float/double並在顯示結果時指定小數。

+3

這樣做可能會損失很多精度。 – 2009-12-06 19:34:07

+0

儘管如此,如果數字太多,那不會給出確切的答案。根據使用情況,這可能是足夠好的,但我認爲這不是這個任務的重點。 – 2009-12-06 19:41:23

1

檢查這個BigInteger library和一個very basic sample code世界七。

如果你有興趣在C(僅乘法)我的一些家常代碼:

//////////////////////////////////////////////////////////////////////////////// 

Code removed after I checked the home-work tag ;) 

/////////////////////////////////////////////////////////////////////////////////////// 

這工作在一些我曾參與早期的編程競賽;)但是,如果你正在尋找甚至更快的乘法算法可以實現Karatsuba algorithm,我現在親自使用這個實時比賽。

+0

(第一個鏈接是_Mahbub Murshed Suman_的_BigInteger class_(版本6.7.28,2004年7月30日),第二個來自_World of Seven-Competitive Programming_,即使URL是「steven」。) – greybeard 2016-02-05 14:28:53

1

嗨,哥們,看看這個,我剛剛完成了它的昨天一天,我的功課的一部分:

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