题目的主要信息:

输入两个用字符串 str 表示的整数,求它们所表示的数之和。输入的整数可能会超过int的长度,所以我们不能直接用int计算,需要逐位计算。

方法一:

首先我们将两个字符串倒序存储在vector中,为了计算的时候简便,我们统一两个数组的长度,给长度较小的数组在末尾补上零,因为我们现在已经把字符串倒置了,数组的末尾代表的是整数的高位,所以我们在高位补零的操作是可行的,不会影响结果。

数据处理好以后,我们遍历一遍两个字符串逐位进行计算。在第i位的结果为temp=num1[i]+num2[i]+intemp=num1[i]+num2[i]+in,in代表的是第i-1位对第i为的进位。因为temp的值可能会超过10,所以结果的第i位为temp%10,in更新为temp/10,若果temp<10,in为0。需要注意的是,如果两个字符串遍历完了,此时得到的res不是最终结果,我们需要考虑in里是否还有数字,如果有数字的话,说明两个数字在最高位发生了进位,需要把这个进位也输出。

最后我们需要倒置一遍vector,从高位开始输出。

alt

具体做法:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

int main(){
    string str1,str2;
    while(cin>>str1>>str2){
        vector<char> res;//用于保存结果
        vector<char> num1;
        vector<char> num2;
        for(int i=str1.size()-1;i>=0;i--){//倒序存储字符
            num1.push_back(str1[i]);
        }
        for(int i=str2.size()-1;i>=0;i--){//倒序存储字符
            num2.push_back(str2[i]);
        }
        int len1=num1.size();
        int len2=num2.size();
        //将两个字符串统一长度,高位补0
        if(num1.size()>num2.size()){
            for(int i=0;i<len1-len2;i++){
                num2.push_back('0');
            }
        }else{
            for(int i=0;i<len2-len1;i++){
                num1.push_back('0');
            }
        }
        int in=0;//用于保存进位信息
        for(int i=0;i<num1.size();i++){
            int temp=num1[i]-'0'+num2[i]-'0'+in;//当前位置为两个字符相加再加上进位
            res.push_back(temp%10+'0');
            in=temp/10;//保存进位记录
            
        }
        if(in){//若最后还有进位,该进位也要输出
            res.push_back(in+'0');
        }
        reverse(res.begin(),res.end());//倒置vector,让高位位于vector的开头
        for(auto &i:res){
            cout<<i;
        }
        cout<<endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历一遍字符串,n为字符串最长的长度。
  • 空间复杂度:O(n)O(n),借助vector数组对输入进行补零处理。

方法二:

在java里可以直接把字符串转为大整数,然后再将两个数字相加输出大整数。 具体做法:

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            String str1=in.next();//字符串1
            String str2=in.next();//字符串2
            BigInteger num1=new BigInteger(str1);//将字符串1转换为大整数
            BigInteger num2=new BigInteger(str2);//将字符串2转换为大整数
            System.out.println(num1.add(num2));//输出两个大整数相加的结果
        }
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),大整数相加。
  • 空间复杂度:O(n)O(n),需要用大整数记录字符串。