解题思路:
正整数大数加法,思路是输入两个string对象a和b
把a字符串中的每一个数字都逆序存储在int数组c中
如:输入字符串a和b
a: 9796
b: 194
接下来把a逆序存储进入c
所以在c中为: 6979
让c和b相加,b要逆序来和c相加,所以相加的时候是可以看成
c: 6979
+b: 491
然后让c从下标0开始,b从下标 b.size()-1开始,把c的数字和b的字符(转换成数字)相加,并把两数之和存进c中,然户判断当前下标的c是不是大于10,大于10的就让c的前一个下标数+1,也就是满10进1,然后当前c坐标%10就是进1后剩下的数字就是如下代码“:
j = 0;// j代表c的下标从0开始
for (i = y - 1; i >= 0; i--){ // i代表b.size()-1;
c[j] += b[i] - '0';
if (c[j] >= 10){c[j + 1]++;c[j] %= 10;}
j++;
}
相加完之后,上面的代码是当a的数字个数 <= b的数字个数的情况
所以接下来我们要考虑当a的个数 > b的个数 ,如下面代码
if (x > y){
for (; j < x; j++){
if (c[j] >= 10){c[j + 1]++; c[j] %= 10; }
}
}
和b相加完之后,因为a的个数>b的个数,还要判断剩下的a的个数是不是有大于10的,大于10的也要进位,如
c:9976 b:89
相加过程为:
6799
+ 98
--------------
56001
可以看出a的个数大于b的个数,a是4,b是2,相加是按照b的个数相加,也就只有67和98相加而已
剩下了 c: 5 6 10 9 现在c的个数还是4个 ,但是我们所需要的结果是 56001
所以我们看到6后面的10,这很明显满10了,所以要进1,变成0,9+1=10,结果为: 56010,但是个数还是4个,而不是5个
所以结果中还是有10,还是需要进位,结果为:56001,所以得到了最终结果
最后就是输出的问题:输出我们是在c中输出,但是是逆序输出,如上面的最终结果:56001
我们需要的答案肯定是一万零六十五,也就是10065,所以我们需要逆序来输出,从1开始向5来输出
但是输出的时候我们还要看最高位是不是为0才来输出:
如上面的 c+b 9976+89
得到结果是56001,此时的 j 是下标 4,就是c[j] = c[4] = 1
然后 for (i = j; i>=0; i--)cout << c[i]; 输出就好了
但是如果是 c: 12345 b:33 c+b
得到结果是 87321 ,但是此时的 j 是下标 5,而c[j]=c[5]=0 如果还是代码 for (i = j; i>=0; i--)cout << c[i];
输出就是 012378了
所以这种情况需要j-1,才能输出 12378
注意事项:
参考代码:
#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<functional>
using namespace std;
int main(){
string a, b;
int x, y,i,j,k;
int c[1050];
while (cin>>a>>b){
x = a.size();y = b.size();
j = 0;
memset(c, 0, sizeof(c));memset(d, 0, sizeof(d));
for (i = x - 1; i >= 0; i--)c[j++] = a[i]-'0';
j = 0;
for (i = y - 1; i >= 0; i--){
c[j] += b[i] - '0';
if (c[j] >= 10){c[j + 1]++;c[j] %= 10;}
j++;
}
if (x > y){
for (; j < x; j++){
if (c[j] >= 10){c[j + 1]++; c[j] %= 10; }
}
}
if (c[j] == 0)j -= 1;
for (i = j; i>=0; i--)cout << c[i];
cout << endl;
}
return 0;
}
0.0分
5 人评分