大整数乗算
1728 ワード
大整数乗算
c++実装
思想:縦計算、全体的に進位を考える
835 * 49
a:
index: 2 1 0
8 3 5
b:
index: 2 1 0
0 4 9
結果配列r,835*9先不進位
r:
index: 2 1 0
72 27 45
5*4は10ビット、r[1]+=20
r:
index: 2 1 0
72 47 45
3*4は100ビット、r[2]+=12
r:
index: 2 1 0
87 47 45
8*4は千位、r[3]+=32
r:
index: 3 2 1 0
32 84 47 45
乗算プロセスが完了し、キャリー計算を行い、最終結果を得る
r:
index:4 3 2 1 0
4 0 9 1 5
具体的な実装:
c++実装
思想:縦計算、全体的に進位を考える
835 * 49
a:
index: 2 1 0
8 3 5
b:
index: 2 1 0
0 4 9
結果配列r,835*9先不進位
r:
index: 2 1 0
72 27 45
5*4は10ビット、r[1]+=20
r:
index: 2 1 0
72 47 45
3*4は100ビット、r[2]+=12
r:
index: 2 1 0
87 47 45
8*4は千位、r[3]+=32
r:
index: 3 2 1 0
32 84 47 45
乗算プロセスが完了し、キャリー計算を行い、最終結果を得る
r:
index:4 3 2 1 0
4 0 9 1 5
具体的な実装:
#include<iostream>
using namespace std;
void main(){
char a[201], b[201];
int a1[402], b1[402], r[402];
memset(a1, 0, sizeof(a1));
memset(b1, 0, sizeof(b1));
memset(r, 0, sizeof(r));
cin >> a >> b;
int len1 = strlen(a);
int len2 = strlen(b);
int i, j = 0, k = 0;
for(i = len1 - 1; i >= 0; i --){
a1[j ++] = a[i] - '0';
}
j = 0;
for(i = len2 - 1; i >= 0; i --){
b1[j ++] = b[i] - '0';
}
for(i = 0; i < len1; i ++){
k = i;
for(j = 0; j < len2; j ++){
r[k ++] += a1[i] * b1[j];
}
}
int n = 0;//
int temp;
for(i = 0; i < k; i ++){
temp = r[i] + n;
r[i] = temp % 10;
n = temp / 10;
}
if(n != 0)
cout << n;
for(i = k - 1; i >= 0; i --){
cout << r[i];
}
cout << endl;
}