因为,这是小学思维就不再多加说明,所以我决定直接贴代码。
其实减法也做了,如果实在没写的了,俺可能就贴出来了(手动秃头)。
这里是定义数字最大为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。