zoukankan      html  css  js  c++  java
  • 大数加法

    题目描述

    求两个不超过200位的非负整数的和。

    输入

    有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

    输出

    一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

    样例输入

    22222222222222222222
    33333333333333333333

    样例输出

     
    55555555555555555555
     
    本来想用一个函数来相加,但发现不能正确传递,这个问题(数组名作函数参数)下次解决。
    #include <iostream>  
    #include <string>  
    #include <cstring>  
    #include <algorithm>  
    using namespace std;  
    char a[205]; int la;  
    char b[205]; int lb;  
    char c[205]; int l;  
    //int jjj(char xx[], char yy[])//不知道怎么传递,伤心  
    //{  
    //  int i;  
    //  int x=0, y=0;  
    //  for (i = l - 1; i >= 0; i--)  
    //  {  
    //      int s;  
    //      s = xx[i] - '0' + yy[i] - '0' + x;  
    //      if (s >= 10)  
    //      {  
    //          x = s / 10; c[i] = s % 10 + '0';  
    //      }  
    //  }  
    //  return x;  
    //}  
    int main()  
    {  
      
        cin >> a; cin >> b;  
        la = strlen(a);  
        lb = strlen(b);  
        l = max(la, lb);  
        int i;  
        //以下这一步,我是为了让两个字符数组的个数相同,  
        //短的字符数组,前面用0补齐  
        //同时,为了统一,两个相加的字符数组分别变为数组c和数组a  
        if (la >=lb)  
        {  
            for (i = 0; i <= la - lb - 1; i++) c[i] = '0';  
            for (i = la - lb; i < la; i++)  
                c[i] = b[i - (la - lb)];  
      
        }  
        else if (lb > la)  
        {  
            for (i = 0; i <= lb - la - 1; i++)   c[i] = '0';  
            for (i = lb - la; i < lb; i++)  c[i] = a[i - (lb - la)];  
            for (i = 0; i < lb; i++) a[i] = b[i];  
        }  
        int x = 0, y = 0;  
        memset(b, 0, sizeof(0));//数组b用来存放最终答案  
        for (i = l - 1; i >= 0; i--)//从个位开始加  
        {  
            int s;  
            s = c[i] - '0' + a[i] - '0' + x;   
            x = 0;//这一步太重要,没有这一步过不了样例:0342+888888;  
            //因为百位,8+3为11,x为1;x不清零的话,千位会变成9,但实际上应该是8  
            if (s >= 10)  
            {  
                x = s / 10; //x为要进上去的数,比如个位13,3留下,1进上  
                b[i] = s % 10 + '0';  
            }  
            else b[i] = s + '0';  
        }  
        if (x != 0)//最后1个x就是最高位的数  
        {  
            cout << x;  
            for (i = 0; i < l; i++) cout << b[i];  
        }  
        else//注意前导0的情况  
        {  
            bool f = 1;  
            for (i = 0; i < l ; i++)  
            {  
                if (f == 0) cout << b[i];//x为0,即最高为0,只后还是0的话就不要输出了  
                //f==0代表之前有一位不是0,那么后面几位都可以放心输出,比如100010  
                if (f == 1 && b[i] != '0')   
                { f = 0; cout << b[i]; }  
      
            }  
        }  
        cout << endl;  
        return 0;  
    }  
  • 相关阅读:
    9.5 dubbo事件通知机制
    9.4 dubbo异步调用原理
    13.1 dubbo服务降级源码解析
    第十八章 dubbo-monitor计数监控
    12.4 客户端响应解码
    12.3 服务端响应编码
    12.2 服务端请求解码
    12.1 客户端请求编码
    git生成并添加SSH key
    Java并发之原子操作类汇总
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271317.html
Copyright © 2011-2022 走看看