高精度乘法關(guān)鍵代碼
//乘法進(jìn)位:
c[i+j-1]= a[i]*b[j] + x + c[i+j-1];
x = c[i+j-1]/10;
c[i+j-1] %= 10;
高精度乘法震缭。輸入兩個正整數(shù),求它們的積战虏。
分析
類似加法拣宰,可以用豎式求乘法。在做乘法運算時烦感,同樣也有進(jìn)位巡社,同時對每一位進(jìn)行乘法運算時,必須進(jìn)行錯位相加手趣,如圖3晌该、圖4。
分析c數(shù)組下標(biāo)的變化規(guī)律绿渣,可以寫出如下關(guān)系式:ci = c’i +c”i +…由此可見朝群,c i跟a[i]b[j]乘積有關(guān),跟上次的進(jìn)位有關(guān)怯晕,還跟原c i的值有關(guān)潜圃,分析下標(biāo)規(guī)律,有c[i+j-1]= a[i]b[j]+ x + c[i+j-1]; x=c[i+j-1]/10 ; c[i+j-1]%=10;
詳細(xì)算法如下
#include<iostream>
#include<cstring>
using namespace std;
char a[100]={}, b[100]={};
int a1[100]= {}, a2[100]={}, a3[100]={},la, lb;
int main(){
cin >> a >>b;
la = strlen(a);
lb = strlen(b);
for (int i = 0; i <= la - 1; i ++){
a1[la -i] = a[i] - '0';
}
for (int i =0; i <= lb- 1; i++){
a2[lb -i] = b[i] - '0';
}
// 做乘法運算
for (int i = 1; i <= la; i++){ // 乘數(shù)
int x = 0;
for (int j = 1; j<= lb; j++){ // 被乘數(shù)
a3[i +j -1] = a1[i] * a2[j] + x + a3[i + j - 1];
x = a3[i + j -1] /10; // 進(jìn)位
a3[i+j-1] %= 10;
}
a3[i+lb] = x; // 最高位的進(jìn)位
}
int lc = la + lb;
while (a3[lc] == 0 && lc >1){ // 去掉多余的0
lc--;
}
for(int i = lc; i>0; i--){
cout << a3[i];
}
return 0;
}