#include <iostream>
using namespace std;
long long a[10000000],b[10000000],c[10000000];
int main(){
string n,m;
cin>>n>>m;
int len=max(n.length(),m.length());
for(int i=n.length()-1,j=1;i>=0;i--,j++){
a[j]=n[i]-'0';
}
for(int i=m.length()-1,j=1;i>=0;i--,j++){
b[j]=m[i]-'0';
}
for(int i=1;i<=len;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
if(c[len+1]) len++;
for(int i=len;i>=1;i--) cout<<c[i];
return 0;
}
思路:先创建三个长整形数组a(表示最后的结果),b(统计一个加数的每一位)和c(统计另一个加数的每一位)。再声明两个字符串n(一个加数)和m(另一个加数)。再输入n和m。再初始化一个整型变量len为n的长度和m的长度中最大的一个,用来在后面一位一位地加n和m。
再创建一个for循环,把n数组的每i位变成整数并反转赋值给a数组,因为加法是从右往左加的,但计算机不是,所以要反转赋值。在创建一个for循环,把m数组的每i未变成整数并反转赋值给b数组(这里原理相同,所以就不讲了)。
再创建一个for循环,次数为len。再循环内模拟加法:先把a数组的第i位加b数组的第i位赋值给c数组的第i位。再让本次循环的加法的位数的下一位等于本次循环的加法的位数除以10,因为如果本次循环的加法的位数需要进位,则进位的数量就等于本次循环的加法的位数的下一位等于本次循环的加法的位数除以10,就算不需要进位,那除以10的结果也是0,相当于没有加。再让本次循环的加法的位数取余10,因为如果本次循环的加法的位数进位了,那么剩下的数就是取余10后的结果,就算没进位,取余10的结果也等于原数,相当于没有变。
有一种情况:如果最后一位也进位了,那整个数的长度就增加了,所以再判断一下c数组的长度加1的位置是否有数,如果有,长度就加1,反之则不做任何事。
最后,因为给数组赋值的时候是反转赋值的,所以输出时也要反转输出。