高精度乘法--C++
模仿豎式乘法,在第一步計算的時候將進位保留,第一步計算完再處理進位。(見代碼注釋)
若要處理正負情況,可在數據輸入后加以判斷,處理比較簡單。
小數計算也可參照該方法,不過對齊方式需要改變,或者改成二段計算。
#include <iostream>
#include <cstring>
#define MAXSIZE 20
#define MAXOUTSIZE MAXSIZE * 2 + 1
using namespace std;
int main()
{
char a[MAXSIZE] = {'0'},
b[MAXSIZE] = {'0'},
c[MAXOUTSIZE] = {'\0'};
int a_int[MAXSIZE] = {0},
b_int[MAXSIZE] = {0},
c_int[MAXOUTSIZE] = {0};
cin >> a;
cin >> b;
int len_a = strlen(a), len_b = strlen(b);
memset(a_int, 0, sizeof a_int);
memset(b_int, 0, sizeof b_int);
memset(c_int, 0, sizeof c_int);
//末位對齊
for (int i = len_a - 1, j = 0; i >= 0; i--, j++)
{
a_int[j] = a[i] - '0';
}
for (int i = len_b - 1, j = 0; i >= 0; i--, j++)
{
b_int[j] = b[i] - '0';
}
//計算每一位,但是不處理進位
for (int i = 0; i < len_a; i++)
{
for (int j = 0; j < len_b; j++)
{
c_int[i + j] += a_int[i] * b_int[j];
}
}
//處理進位
int ans_len = 0;
for (int i = 0; i < 2 * MAXSIZE; i++)
{
c_int[i + 1] += c_int[i] / 10;
c_int[i] %= 10;
ans_len = i;
}
//移除序列高位的0,實際上是統計非0位數
while (c_int[ans_len] == 0)
{
ans_len--;
}
if (ans_len < 0)
{
cout << "0";
return 0;
}
for (int i = ans_len; i >= 0; i--)
{
c[i] = c_int[i] + '0';
}
for (int i = MAXOUTSIZE - 1; i >= 0; i--)
{
if ('\0' != c[i])
{
cout << c[i];
}
}
return 0;
}