题目的主要信息:
输入两个用字符串 str 表示的整数,求它们所表示的数之和。输入的整数可能会超过int的长度,所以我们不能直接用int计算,需要逐位计算。
方法一:
首先我们将两个字符串倒序存储在vector中,为了计算的时候简便,我们统一两个数组的长度,给长度较小的数组在末尾补上零,因为我们现在已经把字符串倒置了,数组的末尾代表的是整数的高位,所以我们在高位补零的操作是可行的,不会影响结果。
数据处理好以后,我们遍历一遍两个字符串逐位进行计算。在第i位的结果为,in代表的是第i-1位对第i为的进位。因为temp的值可能会超过10,所以结果的第i位为temp%10,in更新为temp/10,若果temp<10,in为0。需要注意的是,如果两个字符串遍历完了,此时得到的res不是最终结果,我们需要考虑in里是否还有数字,如果有数字的话,说明两个数字在最高位发生了进位,需要把这个进位也输出。
最后我们需要倒置一遍vector,从高位开始输出。
具体做法:
#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;
}
复杂度分析:
- 时间复杂度:,需要遍历一遍字符串,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));//输出两个大整数相加的结果
}
}
}
复杂度分析:
- 时间复杂度:,大整数相加。
- 空间复杂度:,需要用大整数记录字符串。