夯实基础算法

大数相加算法

2018-09-20  本文已影响0人  baby_double

1、题目:实现两个大数相加。
2、算法流程:
(1)大数可能超出任何一种整数类型,会引发溢出问题,所以用字符串的格式存储字符串a,b;
(2)获取字符串a的长度为aLen,字符串b的长度为bLen;
(3)比较aLen和bLen的大小,用maxLen保存更大值。
(4)创建数组aArr,大小为maxLen,保存字符串a每一位上的值,举例下图所示。


image.png

(5)创建数组bArr,大小为maxLen,保存字符串b每一位上的值,不够的补0,例如。


image.png
(6)创建数组sumArr,大小为maxLen,保存两数之和。
(7)创建一个整数用于保存两数相加的进位jin,初始化等于0,是因为两个数的个位数相加进位一定等于0。
(9)因为两数相加一般从个位开始,所以用sumArr[maxLen-1]保存(a的个位+b的个位的+进位)的和除以10的余数,获取进位jin=(a的个位+b的个位的+进位)的和除以10的整除数。具体如下所示:
image.png
(10)各对应的位数相加完之后,判断进位jin是否等于1,如果等于1则输出 cout <<"1";
然后从高位到低位输出sumArr的各位数。

3、具体代码如下所示:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 char* a="11111111111111111111111111";
 char* b="91111111111111111111111111111111111";
 int aLen=strlen(a);
 int bLen=strlen(b);
 cout << "aLen="<<aLen<<" bLen="<<bLen<<endl;
 int maxLen=0;

 if(aLen>bLen){
    maxLen=aLen;
 }else{
     maxLen=bLen;
 }
 cout << "maxLen="<<maxLen<<endl;
 int* aArr=new int[maxLen];
 int* bArr=new int[maxLen];
 int* sumArr=new int[maxLen];

 for(int i=maxLen-1;i>=0;i--){
    if(aLen<=0){
        aLen=0;
        aArr[i]=0;
    }else{
        aArr[i]=a[--aLen]-'0';
    }
    cout << aArr[i];
 }

 cout <<endl;
 for(int j=maxLen-1;j>=0;j--){
    if(bLen<=0){
        bArr[j]=0;
    }else{
       bArr[j]=b[--bLen]-'0';

    }
    cout << bArr[j];
 }
 cout <<endl;
 int jin=0;
 for(int k=maxLen-1;k>=0;k--){
    sumArr[k]=(aArr[k]+bArr[k]+jin)%10;
    jin=(aArr[k]+bArr[k]+jin)/10;
    cout << sumArr[k];
 }
 cout <<endl;
 if(jin!=0){
    cout <<"1";
 }
 for(int t=0;t<maxLen;t++){
    cout << sumArr[t];
 }
return 0;
}
上一篇下一篇

猜你喜欢

热点阅读