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