贺州学院ivy


私信TA

用户名:Livy

访问量:21427

签 名:

好好学习,天天向上,汝何秀?

等  级
排  名 130
经  验 7405
参赛次数 5
文章发表 25
年  龄 0
在职情况 学生
学  校 贺州学院
专  业 软件工程

  自我简介:

假猪套天下第一

解题思路:


                 正整数大数加法,思路是输入两个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 人评分

  评论区