高精度乘法,主要思想是把第一个因子的个位都与第二个因子每个位相乘后存储对应的i+j的p数组中,接着继续第一个因子的十位,并累加到对应的p【i+j】中,依次进行到最高位。最后再对每个p应用高精度加法的思想,累加取进位和余位。
需要注意的是:积的长度是因子的长度和或者长度和-1
//10106 - Product
//高精度乘法
#include <iostream>
#include <cstring>
using namespace std;
char product[600], a[300], b[300];
int P[600], A[300], B[300];
int transfort(char *, int *);//把字符数组反转后,转化为int数组
void reverse(int);//按len的长度反转int数组并转换为字符数组
int main()
{
//freopen("data.txt", "r", stdin);
while (scanf("%s%s", a, b) == 2)
{
if(a[0] == '0' || b[0] == '0')//处理输入为0的情况
{
printf("0\n");
continue;
}
int len_a = transfort(a, A);
int len_b = transfort(b, B);
int len_P = len_a + len_b;
for(int i = 0; i < len_a; i++)
for(int j = 0; j < len_b; j++)
P[i + j] += A[i] * B[j];//每一对应位的积累加
for(int i = 0; i < len_P - 1; i++)
{
P[i + 1] += P[i] / 10;//进位的值
P[i] %= 10;//余位
}
if(P[len_P - 1] == 0)//判断最高位的值
len_P--;//积的长度为两个因子的长度和或者长度和-1
reverse(len_P);
printf("%s\n", product);
memset(product, 0, sizeof(product));
memset(P, 0, sizeof(P));
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
}
return 0;
}
void reverse(int n)
{
for(int j = 0; j < n; j++)
product[j] = P[j] + '0';
char c;
for(int i = 0; i < n / 2; i++)
{
c = product[i];
product[i] = product[n - i - 1];
product[n - i - 1] = c;
}
}
int transfort(char * s, int *A)
{
int len = strlen(s);
for(int i = 0; i < len; i++)
A[i] = s[len - i - 1] - '0';
return len;
}