C++ 高精度乘法运算
思想
首先确定乘积的位数。
假设两个非负整数a和b,n1为a的长度(位数),n2为b的位数,记n为c=a*b的位数,则有:
$$ n\le n_1+n_2 $$
计算两个乘数每位数字的乘积,其中a[i]乘b[j]累加到c[i+j]上去
在最后对累加结果数组c作一次性进位(判断是否大于等于10)
代码
知道上述原理,很容易就写出代码
#include <iostream>
#include <string>
#include <algorithm>
#include <string.h>
using namespace std;
int main()
{
//输入时处理,包含置0、逆置、转换成真实数字等步骤
string s;
cin >> s;
int n1 = s.length(); //长度
char str1[10];
memset(str1, 0, sizeof(str1));
for (int i = 0; i < n1;i++)
str1[i] = s[n1 - i - 1]-'0';
string s2;
cin >> s2;
int n2 = s2.length();
char str2[10];
memset(str2, 0, sizeof(str2));
for (int i = 0; i < n2;i++)
str2[i] = s2[n2 - i - 1]-'0';
char res[20];
memset(res, 0, sizeof(res));
//核心代码
int i, j;
for (i = 0; i < n1;i++)
for (j = 0; j < n2;j++)
res[i + j] += str1[i] * str2[j];
for (i = 0; i < n1 + n2;i++)
{
if(res[i]>=10)
{
res[i + 1] += res[i] / 10;
res[i] %= 10;
}
}
//从不为0的那一位开始输出(删除前导0),如果全部为0,则输出0
int k;
for (k = n1 + n2 - 1; !res[k]&&k>0; k--)
; //注意这个分号
for (int i = k; i >= 0; i--)
cout << int(res[i]);
cout << endl;
return 0;
}