2 条题解

  • 2
    @ 2022-12-26 10:06:23

    再开始做本题前,让我们先分析一下:

    这道题与高精度减法2的区别在于这一句话:注意:输入的数可能是负数!

    因此我们可以列举出每一种情况以及其算数方法:

    a \ b 是负数 不是负数
    是负数 做减法,有负号 做加法,有符号
    不是负数 做加法,无负号 做减法

    其中若a与b均不是负数,则有两种情况:

    • 若a >= b ,则无符号
    • 若a < b,则有负号

    因此,我们可以定义3个bool变量,分别存储a是否为负数,b是否为负数,结果是否为负数,和一个char变量,存储使用加法还是减法,然后在对它们赋值,如下:

    bool negative = false , aNegative = false , bNegative = false;
    
    if (a[0] == '-') aNegative = true;
    if (b[0] == '-') bNegative = true;
    if (aNegative)
    {
        negative = true;
        if (bNegative)
        {
            mod = '-';
            //注意这一步不能忘(比较两数大小)
            if (lena < lenb || (lena == lenb && a < b))
            {
                negative = false;//负负得正,所以要再赋值为false
                swap(a , b);
                swap(lena ,  lenb);
            }
        }
        else mod = '+';
    }
    else if (bNegative) mod = '+';
    else
    {
        mod = '-';
        if (lena < lenb || (lena == lenb && a < b))
        {
            negative = true;
            swap(a , b);
            swap(lena ,  lenb);
        }
    }
    

    之后就要将数字存储到数组里,看似简单,实际有点复杂,详见注释吧……

    for (int i = aNegative ? 1 : 0 ; i < (aNegative ? lena + 1 : lena) ; i++)//由于第一个字符有可能是负数,所以要从下标为1开始遍历
    {
        numa[aNegative ? i - 1 : i] = a[lena - (aNegative ? i - 2 : i) - 1] - '0';//注意这里是i - 2
    }
    //b同理
    for (int i = bNegative ? 1 : 0 ; i < (bNegative ? lenb + 1 : lenb) ; i++)
    {
        numb[bNegative ? i - 1 : i] = b[lenb - (bNegative ? i - 2 : i) - 1] - '0';
    }
    

    之后就没什么多说的了。

    AC Code:

    #include <bits/stdc++.h>
    using namespace std;
    string a , b;
    int ans[2100] , numa[2100] , numb[2100] , lena , lenb , top;
    bool negative = false , aNegative = false , bNegative = false;
    char mod;
    int main()
    {
        cin >> a >> b;
        lena = a[0] == '-' ? a.length() - 1 : a.length();
        lenb = b[0] == '-' ? b.length() - 1 : b.length();
    
        if (a[0] == '-') aNegative = true;
        if (b[0] == '-') bNegative = true;
        if (aNegative)
        {
            negative = true;
            if (bNegative)
            {
                mod = '-';
                if (lena < lenb || (lena == lenb && a < b))
                {
                    negative = false;
                    swap(a , b);
                    swap(lena ,  lenb);
                }
            }
            else mod = '+';
        }
        else if (bNegative) mod = '+';
        else
        {
            mod = '-';
            if (lena < lenb || (lena == lenb && a < b))
            {
                negative = true;
                swap(a , b);
                swap(lena ,  lenb);
            }
        }
      
        for (int i = aNegative ? 1 : 0 ; i < (aNegative ? lena + 1 : lena) ; i++)
        {
            numa[aNegative ? i - 1 : i] = a[lena - (aNegative ? i - 2 : i) - 1] - '0';
        }
      
        for (int i = bNegative ? 1 : 0 ; i < (bNegative ? lenb + 1 : lenb) ; i++)
        {
            numb[bNegative ? i - 1 : i] = b[lenb - (bNegative ? i - 2 : i) - 1] - '0';
        }
    
        for (int i = 0 ; i < 2000 ; i++)
        {
            if (mod == '+') ans[i] += numa[i] + numb[i];
            else ans[i] += numa[i] - numb[i];
        }
    
        for (int i = 0 ; i < 2000 ; i++)
        {
            if (ans[i] < 0)
            {
                ans[i] += 10;
                ans[i + 1]--;
            }
            if (ans[i] > 9)
            {
                ans[i + 1] += ans[i] / 10;
                ans[i] %= 10;
            }
        }
        top = 2000;
        while (ans[top] == 0 && top >= 0) top--;
        if (negative && top > -1) cout << "-";//注意,没有-0一说,所以要额外特判
    
        for (int i = top ; i >= 0 ; i--)
        {
            cout << ans[i];
        }
        if (top == -1) cout << "0";
        return 0;  
    }
    
    • 0
      @ 2023-2-11 21:30:09

      写题解请注意

      鼓励大家写题解,但注意题解格式。

      题解一定要有思路解析或代码注释,能否让别人理解你的思路

      也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

      给代码两端加上这个会舒服一些

      ```cpp

      你的代码

      ```

      这个点在键盘的左上角tab上面那个键,注意切换输入法

      #include<iostream>
      using namespace std;
      int main()
      {
          int n;
          cin>>n;//这是一个注释
          return 0;
      }
      

      请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

      抄袭题解一经发现直接取消成绩。

      题解被删除的可能

      1. 代码不符合格式规范
      2. 没有思路讲解或者没有注释,
      3. 无意义的题解

      大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

      • 1

      信息

      ID
      942
      时间
      1000ms
      内存
      16MiB
      难度
      3
      标签
      递交数
      38
      已通过
      22
      上传者