1. 思路
其实就是模拟,加法是最简单的,从个位开始加,价位加到前一位,然后再取10的余数。
for (int i = 1; i <=len ; ++i) {
// 计算和
c[i] += a[i]+b[i];
// 进位
c[i+1] = c[i]/10;
// 取10的余数
c[i]%=10;
}
2. 实现
int len = max(A.length(),B.length());
// 倒着存,个位到十位,百位。。
for (int i = A.length()-1,j=1; i >=0 ; i--,j++) {
a[j] = A[i] - '0';
}
for (int i = B.length()-1,j=1; i >= 0; i--,j++) {
b[j] = B[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];
}
luogu上面是从1开始,就是数组0号位不用,我比较习惯从0开始用。
所以稍微适配一下从0开始的写法:
string A,B;
cin>>A>>B;
int len = max(A.length(),B.length());
// 倒着存,个位到十位,百位。。
for (int i = A.length()-1,j=0; i >=0 ; i--,j++) {
a[j] = A[i] - '0';
}
for (int i = B.length()-1,j=0; i >= 0; i--,j++) {
b[j] = B[i]-'0';
}
for (int i = 0; i <len ; ++i) {
c[i] += a[i]+b[i];
c[i+1] = c[i]/10;
c[i]%=10;
}
if (c[len])len++;
// 逆序输出
for (int i = len-1; i >=0 ; i--) {
cout<<c[i];
}
3. 相关题目
4. 后记
有时候不要懒,没有那么复杂,当然这个是裸的写法,最好是整合到struct 封装一下,再重载运算符来简化一下操作,之后会总结。