大正整数加法模板


前言

在日常竞赛刷题中,难免会遇到大整数加法作为解题的中间步骤。

实现思路

首先不难发现,两个数相加,和的位数不会大于最大运算数位数+1,如999 +99 = 1098.

接下来,我们模拟手算法,主要是对进位的合理处理

具体实现方式

使用字符串保存两个运算数

接下来定义三个整数向量,每个向量长度为最大运算数位数+1

然后将两个运算数的反转字符串转为整数,存在两个向量中

之后我们对每一位进行加法运算,如果一位的数大于9,则向前进一位同时本位减1。 每一位存在向量的一个单位里。

最后把向量转化为字符串加起来再进行反转即为所求(注意处理第一位为0的情况)

参考代码

#include<iostream>
using namespace std;
#include<vector>
#include<string>
#include<algorithm>
#include <sstream>
#include <math.h>
string multadd(string a , string b){
     string re  ;
     vector<int> tmp ;
     reverse(a.begin(),a.end());
     reverse(b.begin(),b.end());
    
     int len = max(a.size(),b.size()) + 1 ;
     for(int i = 0 ; i < len ; ++i)  {tmp.push_back(0);}

    vector<int> an(len+1),bn(len+1);
    for(int i = 0; i < a.size() ; ++i)  {an.at(i) = a[i] - '0';}
    for(int i = 0; i < b.size() ; ++i)  {bn.at(i) = b[i] - '0';}

     for(int i = 0 ; i < len+1; ++i){
         int res = tmp[i];
         res += an[i];
         res += bn[i];
         if(res >= 10){
             res -= 10;
             tmp[i+1] = 1;
         }
         tmp[i] = res;
     }
     for(int i = 0 ; i < tmp.size() ; ++i){
         stringstream ss;
         ss << tmp[i];
         re += ss.str();
     }
     reverse(re.begin(),re.end());
     if(re[0] == '0') {re = re.substr(1,re.size()-1);}
     return re;
}

int main(){
    string a ,b;
    cin >> a>>b;
    cout<<multadd(a,b);
    return 0;
}

解法二

直接进行按位加减,最后如果有进位,则在字符串前补进位即可

参考代码二

string multadd(string a , string b){
       if(a.size() < b.size()){
           a.insert(0,b.size() - a.size(),'0');
       }
       else if (a.size() > b.size()){
           b.insert(0,a.size()-b.size(),'0');
       }
       int cn = 0 ;
       for(int i = a.size() - 1; i >= 0 ; --i){
           int tmp = a[i] - '0' + b[i] - '0' + cn;
           a[i] = tmp % 10 + '0';
           cn = tmp / 10;
       }
       if(cn)  {a = '1' + a;}
       return a ;
}

文章作者: 瑾年
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 瑾年 !
  目录