大数相加

多个非负的整数(长度超越long和int)求和,即可所谓的大数相加。
输入多个只包含数字的字符串(用来表示大数),求相加之后的数字结果。
例子:
输入:
3
11111111111111111
99999999999999999
24456131321
输出:
111111135567242431
用C++编写代码如下:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

//实现两个大数(字符串)的相加,并返回string类型计算结果
string add(string str_1,string str_2)
{
    string result;//保存计算结果,倒序保存
    string temp;
    bool carryFlag = false;//进位标志,false表述不进位,true表示进位
    string maxString = (str_1.size()>=str_2.size())? str_1 : str_2;
    string minString = (str_1.size()<str_2.size())? str_1 : str_2;
    //将短字符串补齐到和长字符串一样长,在短字符串前边补上字符'0'
    int maxLength = maxString.size();
    int minLength = minString.size();
    temp.append((maxLength - minLength),'0').append(minString);
    minString.clear();
    minString.append(temp);
    //字符串进行倒序遍历,按位相加
    for(int i=(maxString.size()-1);i>=0;i--)
    {
        int res;
        if(carryFlag)//有进位,计算结果res加1;无进位不加1。
            res = (maxString[i]-48)+(minString[i]-48)+1;//字符'0'在ASCII表中对应十进制数是48
        else
            res = (maxString[i]-48)+(minString[i]-48);
    //判断结算结果res是否产生进位,进位标志carryFlag 的状态也要随之改变
        if(res<10)
            carryFlag = false;//res无进位
        else
            carryFlag = true;//res有进位
        result.push_back((res%10)+48);//将res取10的余数转换为字符保存
    }
    //循环结束后,最后还需要判断一次进位标志,判断两个字符串最后一次相加是否产生进位
    if(carryFlag)
        result.push_back(49);//计算结果是倒序保存,所以在最后添加字符'1'
    reverse(result.begin(),result.end());//将计算结果逆置就是实际计算结果
    return result;
}

//将接收到的输入的string全部保存在vector中,进行循环相加,最终返回计算结果
string sumResult(vector<string> bigNumber)
{
    string res = bigNumber[0];
    for(int i=1;i<bigNumber.size();i++)
    {
        res = add(res,bigNumber[i]);
    }
    return res;
}

int main()
{
    vector<string> bignumber;
    int n;//输入字符串总个数
    cin>>n;
    for(int i=0;i<n;i++)
    {
        string str;
        cin>>str;//输入字符串
        bignumber.push_back(str);//所有输入字符串全部保存在vector中
        str.clear();
    }
    string result = sumResult(bignumber);
    cout<<result<<endl;
    return 0;
}

VisualStudio2017实际结果控制台输出
图片说明
关键点说明:
1.输入的字符串有多个,所以可以全部保存在vector中。
2.遍历vector时候,由于字符串的长度并不相同,所以需要将两个字符串补齐,补充字符'0'。此处要了解append()函数的两种重载 形式:
(1)在字符串的结尾拼接字符串

string str = "1234";
str.append("abcd");//str就为"1234abcd"  

(2)在字符串的结尾拼接字符

string str = "1234";
str.append(3,'a');//str就为"1234aaa"

3.两个相加的字符串,采取倒序遍历按位相加,每次相加之前需要将字符转化为实际对应的数值(减去字符'0'对应的十进制数48),相加的结果进行保存之前进行两次判断。计算结果保存前需要转化为对应的字符,push_back()函数的作用是在字符串的结尾添加一个字符。(要注意区别push_bank()和append()函数的作用)
(1)第一次判断,是判断上一次计算是否产生进位,如果上一次计算产生进位,当前计算结果要加一;
(2)第二次判断,是判断当前计算结果是否产生进位,随之改变进位标志位状态。
4.在两个字符串完成遍历后还需要判断一下进位标志,判断两个字符串最后一次相加是否产生进位,如果产生进位,在计算结果的结尾添加字符'1'(十进制整数49)。
5.计算结果的保存是逆序的,主要是便于存放于字符串中,在最后返回值前,需要将计算结果逆置。