大数相乘算法

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长度的更小者。如下所示:


image.png

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


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

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;}
上一篇 下一篇

猜你喜欢

热点阅读