大数相乘算法
2018-09-21 本文已影响0人
baby_double
1、计算两个大数相乘的结果。
2、算法流程:
(1)大数可能超出任何一种整数类型,会引发溢出问题,所以用字符串的格式存储数a,b;
(2)计算字符串a的的长度aLen即位数,计算字符串b的长度bLen.
(3)两个数相乘最大为aLen+bLen,整形sumLen=aLen+bLen;
(4)声明字符数组maxArr用于保存a,b中的更大者,声明整形maxLen保存a,b长度的更大者。声明字符数组minArr用于保存a,b中的更小者,声明整形minLen保存a,b长度的更小者。如下所示:

(5)创建整形数组sumArr用于保存相乘后的结果,创建整形数组tmpArr保存数a的某一位与数b各位相乘的结果,如下所示:

(6)更小的数minArr的各位(个位,十位,百位,千位等)依次和更大数minArr的各位相乘并存储在临时数组tmpArr中

3、具体代码:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char* a="9999999";
char* b="9999999";
int aLen=strlen(a);
int bLen=strlen(b);
int sumLen=aLen+bLen;
cout << "aLen="<<aLen<<" bLen="<<bLen<<<< "sumLen="<<sumLen<<endl;
int minLen=0,maxLen=0;
char* maxArr,minArr;
if(aLen>bLen){
maxArr=a;
minArr=b;
maxLen=aLen;
minLen=bLen;
}else{
maxArr=b;
minArr=a;
maxLen=bLen;
minLen=aLen;
}
int* sumArr=new int[sumLen];
int* tmpArr=new int[sumLen];
for(int i=0;i<sumLen;i++){
sumArr[i]=0;
tmpArr[i]=0;
}
int mulJin=0,addJin=0;
for(int i=minLen-1;i>=0;i--){
int k=--sumLen;
for(int j=maxLen-1;j>=0;j--){
tmpArr[k]=((maxArr[j]-'0')*(minArr[i]-'0')+mulJin)%10;
mulJin=((maxArr[j]-'0')*(minArr[i]-'0')+mulJin)/10;
k--;
}
if(mulJin>0){
tmpArr[k]=mulJin;
}
mulJin=0;
for(int i=aLen+bLen-1;i>=0;i--){
int tmp=(sumArr[i]+tmpArr[i]+addJin);
sumArr[i]=tmp%10;
addJin=tmp/10;
}
addJin=0;
for(int i=0;i<aLen+bLen;i++){
tmpArr[i]=0;
}
}
int t=0;
while(true){
if(sumArr[t]==0){
t++;
}else{
break;
}
}
for(;t<aLen+bLen;t++){
cout << sumArr[t];
}
return 0;}