AcWing 792. 高精度减法


算法思路

高精度加法大致相同,同样运用了“列竖式”的思想。

当然,加法中的“进位操作”要改成减法中的“退位操作”。

具体过程如下:

  1. 从最低位开始,用被减数的这一位减去减数的这一位;
  2. 判断是否构够减,若不够减(即减数的这一位大于被减数的这一位),则向高一位借一(被减数高一位减一,当前位加十);
  3. 重复以上操作。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;

bool cmp(vector<int> &a, vector<int> &b) //比大小,a大于等于b返回true,否则返回false
{
    if (a.size() != b.size())
    {
        return a.size() > b.size();
    }
    for (int i = a.size() - 1; i >= 0; i -- )
    {
        if (a[i] != b[i])
        {
            return a[i] > b[i];
        }
    }
    return true;
}

vector<int> sub(vector<int> a, vector<int> b)
{
    vector<int> c;
    for (int i = 0, t = 0; i < a.size(); i ++ )
    {
        if (i < b.size()) //减数是否还能继续减
        {
            if (a[i] >= b[i]) //够减
            {
                c.push_back(a[i] - b[i]);
            }
            else  //不够减,借位
            {
                c.push_back(a[i] + 10 - b[i]);
                a[i + 1] -- ;
            }
        }
        else
        {
            if (a[i] >= 0)
            {
                c.push_back(a[i]);
            }
            else //借位
            {
                c.push_back(a[i] + 10);
                a[i + 1] -- ;
            }
        }
    }
    while (c.size() > 1 && c.back() == 0) //处理前导0
    {
        c.pop_back();
    }
    return c;
}

int main()
{
    string a, b;
    vector<int> A, B;
    cin >> a >> b;
    //字符串转数组
    for (int i = a.size() - 1; i >= 0; i -- )
    {
        A.push_back(a[i] - '0');
    }
    for (int i = b.size() - 1; i >= 0; i -- )
    {
        B.push_back(b[i] - '0');
    }
    if (cmp(A, B)) //减数比被减数小(答案为正数)
    {
        auto C = sub(A, B);
        for (int i = C.size() - 1; i >= 0; i -- )
        {
            cout << C[i];
        }
    }
    else //减数比被减数大(答案为负数)
    {
        auto C = sub(B, A);
        printf("-");
        for (int i = C.size() - 1; i >= 0; i -- )
        {
            cout << C[i];
        }
    }
    return 0;
}

/(/text {Python}~yyds/)!

print(input() - input())

原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/277547.html

(0)
上一篇 2022年7月28日
下一篇 2022年7月28日

相关推荐

发表回复

登录后才能评论