大数乘法(C++)
大数乘法(C++)
我们平时接触的乘法运算是主流的竖式乘法,在大数的运算中我们也可以模拟竖式运算的过程
以81✖422的例子,竖式运算是这样的:
我们可以用数组来模拟竖式运算,我们都知道一个两位数乘以一个两位数最多就是四位数,不可能是五位数,那么一个m位数乘以一个n位数最多就是m*n位的数。
我们用二维数组表示81✖422,那么数组的行数就是第一个数的位数,数组的列数就是结果可能的最大的位数,那81✖422运算的过程数组表示为
1、初始化数组:
- 0 0 0 0 0
- 0 0 0 0 0
2、乘法运算后:
- 2 2 4 0 0
- 0 16 16 32 0
3、另设一个数组存每一列的和:
- 2 18 20 32 0
4、再通过低位向高位进位:
- 2 8 1 4 3
5、在转化为字符串然后翻转回来:
- 34182
实际编写代码时可以将数组多增加一行用于存储上面各行的和
具体代码如下
#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
string mul(string a,string b)
{
int lenA = a.length();
int lenB = b.length();
int len = lenA*lenB; //矩阵的列数
int n=lenA+1; //矩阵的行数
int arr[n][len]; //记录竖式运算的每一行
int i=0,j=0;
for(i=0;i<n;i++){ //初始化
for(j=0;j<len;j++){
arr[i][j]=0;
}
}
reverse(a.begin(),a.end()); //将a、b翻转
reverse(b.begin(),b.end());
int temp=0;
for(i=0;i<n-1;i++){ //模拟竖式运算
temp=(a[i]-'0');
for(j=i;j<lenB+i;j++){
int t=b[j-i]-'0';
arr[i][j]=temp*t;
}
}
for(i=0;i<n-1;i++) //矩阵的最后一行用于存上面数的和
for(j=0;j<len;j++)
arr[n-1][j]+=arr[i][j];
for(i=0;i<len;i++){ //逐个进位
if(arr[n-1][i]>0){
arr[n-1][i+1]+=arr[n-1][i]/10;
arr[n-1][i]=arr[n-1][i]%10;
}
}
string c(len,'0');
for(i=0;i<len;i++){ //把整个数组转换成字符串
c[i]=arr[n-1][i]+'0';
}
reverse(c.begin(),c.end()); //翻转
return c.substr(c.find_first_not_of('0')); //返回时去掉前置0
}
int main()
{
string a,b;
cout<<"输入第一个大数:";
cin>>a;
cout<<"输入第二个大数:";
cin>>b;
cout<<"运算结果是:"<<mul(a,b)<<endl;
return 0;
}