2016-07-15
UVA - 10106 Product
题目大意:大整数乘法
解题思路:用字符数组读入,倒序存于整形数组,直接用
z[i+j] = x[i] * y[j] + z[i+j];可另其自动向后挪一位进行相加。
注意:进制要注意,和加法只会进 1 是不同的,还有乘 0 的时候答案为 0。
#include <iostream>
#include <cstring>
using namespace std;
char str1[100000];
char str2[100000];
char *a;
int l;
char _z[100000];
char *multiplication ( char *_str1 , char *_str2 ) {
int len1 = strlen(_str1);
int len2 = strlen(_str2);
l = len1 + len2 - 1;
int x[100000];
int y[100000];
int z[100000];
memset( x , 0 , sizeof(x) );
memset( y , 0 , sizeof(y) );
memset( z , 0 , sizeof(z) );
for (int i = len1-1, n = 0; i >= 0; i--,n++) x[n] = str1[i] - '0';
for (int i = len2-1, n = 0; i >= 0; i--,n++) y[n] = str2[i] - '0';
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
z[i+j] = x[i] * y[j] + z[i+j];
if ( z[i+j] > 9 ) {
z[i+j+1] += z[i+j] / 10;
z[i+j] = z[i+j] % 10;
}
}
}
if ( z[l] == 0 ) l--;
for (int i = l, n = 0; i >= 0; i--,n++) _z[n] = z[i] + '0';
if ( _z[0] == '0' ) l = 0;
return _z;
}
int main() {
while ( cin >> str1 >> str2 ) {
a = multiplication( str1 , str2 );
for ( int i = 0; i <= l; i++) cout << a[i];
cout << endl;
}
return 0;
}