C 實現大數的乘法

2021-06-25 19:51:01 字數 2285 閱讀 5410

參考:

首先說一下乘法計算的演算法,從低位向高位乘,在豎式計算中,我們是將乘數第一位與被乘數的每一位相乘,記錄結果,之後,用第二位相乘,記錄結果並且左移一位,以此類推,直到計算完最後一位,再將各項結果相加。得出最後結果。當然我們可以直接用這種方法,但要用多個鍊錶來儲存計算出的分結果,之後結果再相加得到最後結果,但是這樣會浪費很多空間,我們可以再優化一下,就是只用一人鍊錶來表示結果,先把第一位乘數與被乘數的結果儲存在鍊錶中,之後把儲存結果的頭部後移一位、也就是從鍊錶的第二加起,當第二位乘數與被乘數結果加到第二之後的各個項內。以此類推,直到結束。這樣就可以用乙個鍊錶來儲存相乘後的結果。

在程式時應注意:

1、傳入的乘數和被乘數是以字串形式放入的話,要讓指標指向最後一位,我自己寫了個函式來完成這件事。鍊錶傳入也要找到最後一向來計算;

2、因為傳入和儲存的都是字元,所以計算時要將字元轉化為數字,算完再轉化為字元儲存;

3、另外進製時要處理,當前的值加上進製的值再看本位數字是否又有進製;

4、輸出時要逆序輸出,因為鍊錶首指標是存的結果的最低位。我的函式為了對應輸入輸出結果的一致性,都有採用了字串輸出,所以在輸出時又將鍊錶轉為了字串。

//沒有考慮相乘的數中有負數的情況,只考慮了兩個數都是正數,或者是與數字0相乘

// 首先說一下乘法計算的演算法,從低位向高位乘,在豎式計算中,我們是將乘數第一位與被乘數的每一位相乘,記錄結果,

//之後,用第二位相乘,記錄結果並且左移一位,必須左移一位,保證豎式加法的正確性。以此類推,直到計算完最後一位,再將各項結果相加。得出最後結果。

#include

using namespace std;

bool ismultiplyzero=false;

void multiply(char* num1,char* num2,char* result,int num1length,int num2length,int resultindex)

for(int num1index=0;num1index<=num1length;num1index++)

for(int num2index=0;num2index<=num2length;num2index++)//乘法,做豎式加法,關鍵就是找出其累加位置

temp[resultindex-(num1length+num2length-num1index-num2index)]+=(num1[num1index]-'0')*(num2[num2index]-'0');

for(int i=resultindex;i>=0;i--)

for(int k=resultindex;k>=0;k--)

result[k]=temp[k]+'0';

}//下面是別人寫的大數乘法的**,很有意思。它不是倒著從陣列高位開始儲存的,而是從低位開始的

/*void multiply(char* a,char* b,char* c)

i=0;

while (s[i]==0)

i++;

for (j=0;ic[j]=s[i]+'0';

c[j]='\0';

free(s);

}*/void print(char*num,int nlength)

for(int i=0;i

}cout

char num2="25";

int num1length=strlen(num1)-1;//陣列是從0開始

int num2length=strlen(num2)-1;//陣列是從0開始

int maxlength=(num1length>num2length)? num1length:num2length;

int resultlength=maxlength+10;

int resultindex=resultlength;//用於addition函式中陣列result的標號

char* result=new char[resultlength];

memset(result,'0',resultlength-2);//減2是因為陣列是從0開始,陣列最後一位放置結束符。結果陣列清0,呼叫了memset函式,注意是賦值『0』而不是0,否則出錯

result[resultlength-1]='\0';//陣列新增結束符

resultindex--;//減掉一位,因為最後一位不放任何內容,只放結束符

multiply(num1,num2,result,num1length,num2length,resultindex);

print(result,resultlength);

delete result;

return 0;

}

大數乘法C實現

include include includeconst int maxnumber 1004 實現2個大數相乘 by weibiao 2014 9 27 12 40 void mul char s1,char s2 遍歷s2去乘每個s1整體,然後移位累加 void submul int posva...

C 實現大資料乘法

結構體定義與封裝 struct bigdatacom char getbigdata 進製 for int i lengtha lengthb 1 i 0 i int i 0 while pres i 0 char lastres char malloc sizeof char lengtha le...

C 實現大數乘法運算!!!!

將部落格搬至csdn 因為最近想做介面開發,所以選擇了c 這門物件導向語言,這是筆者第一次接觸物件導向程式設計,以前都是用c和彙編 usingsystem namespace語法 for i 2999,j len2 1 j 0 i j for i 2999 i 2999 len1 i 先按位處理 f...