大整数乗算

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
 
具体的な実装:
#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;


}