因为,这是小学思维就不再多加说明,所以我决定直接贴代码。
这里是定义数字最大为1e240(原题是这样写的),开到了250只是因为,有学长说要有习惯开的数据比题上的数据大一点,可以避免一些麻烦。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char a[250] , b[250];//字符串
int main () {
ll c[250];//数组
cin >> a >> b;
ll i = strlen (a) - 1 , j = strlen (b) - 1;//得到a,b分别是多少位数,包括前导零
//因为是从最低位开始加,所以即使有前导零,也不会发生错位相加的情况
ll s = max (i , j);//按最长的那一个数的最后一个位置开始加
ll n = s , flag = 0;
while(i >= 0|| j >= 0){
if(i < 0) {
c[s] = b[j] - 48 + flag;
flag = 0;
}//如果a的位数更多,包括前导零
else if (j < 0){
c[s] = a[i] - 48 + flag;
flag = 0;
} //如果b的位数更多,包括前导零
else {
c[s] = (a[i] - 48) + (b[j] - 48) + flag;
}
if(c[s] >= 10){
c[s] -= 10;
flag = 1;//如果这一位的数字对应相加超过了10,则记flag为1,方便进位
}else flag = 0;
s --;
i --;
j --;
if (i < 0 && j < 0 && flag == 1)cout << flag;//如果最高位相加仍然超过了10的情况
}
ll d = 0;
for(ll k = 0 ; k <= n ; k ++){
if(c[k] == 0 && d == 0 && flag == 0)continue;//不输出前导零
else {
cout << c[k];
d = 1;//这样可以避免例如,101中间的0不被输出
}
}
return 0;
}
注:这里利用了一下符号数字和数字本身的ASCII码值相差为固定的48。
|