Haslett。 2024-07-16 22:45 采纳率: 100%
浏览 4
已结题

各位帮我看看高精度减法的一个算法题

高精度减法题,各位帮我看看为啥我的输出莫名其妙在结果中间出现了一个负号


#include <bits/stdc++.h>
using namespace std;

bool cmp(vector<int> &a,vector<int >&b)
{
    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> loss01(vector<int> &a,vector<int> &b)
{
    vector<int> C;
    for(int i=0;i<a.size();i++)
    {
        
        if(i>=b.size())
        {
            C.push_back(a[i]);
            continue;
        }
        if(a[i]<b[i])
        {
            a[i]+=10;
            a[i+1]-=1;
        }
        C.push_back(a[i]-b[i]);
    }
    return C;
}
int main()
{
    string A,B;
    vector<int> a,b,C;
    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)==true)C = loss01(a,b);
    else
    {
        
        C= loss01(b,a);
        cout<<"-";
    }
    for(int i=C.size()-1;i>=0;i--)
    {
        cout<<C[i];
    }
    return 0;
}

img

测试数据如下:
834759941806152327900303151940196336060166992323381793006569112355455417182275047723716863558023198812556660965034876453196343663912966691993179332101329457072368130838432382442268056736351699000531533905891383548143212225860594411852986342939876618040011587608495448302207348447231253749252393529480791364963334998240618542705610316034216640260057315992222960153236561529337492196200456790971074681689375240113760172920200875086339547064832250693720175733336019433955946578365398845698054072342

1730212895609293780968781134422638013529337293953691202590416001015768176027398863777824489704339557737408048293638085241389042173942253145158882643543317299641617721453243716470035888718649999433851361288450883586077443742282144148770165505395776302856007672738840600408025145144269621804651639658798526865013172504028693729820255215825318827715895274406426858072321951569289515588456319694750151164168327105512059938690032122373175061408639335004407082357709386204929019847

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-07-16 22:47
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户在实现高精度减法时遇到了一个问题:输出结果中间出现了莫名其妙的负号。我们需要仔细分析代码,找出问题所在,并提供解决方案。

    代码分析

    1. **比较函数 cmp**:

      • 该函数用于比较两个大整数的大小。如果 a 大于等于 b,返回 true,否则返回 false
    2. **减法函数 loss01**:

      • 该函数用于执行大整数的减法操作。如果 a[i] 小于 b[i],则从高位借位。
    3. **主函数 main**:

      • 读取两个大整数 AB,并将其转换为向量 ab
      • 使用 cmp 函数比较 ab 的大小,决定是否输出负号,并调用 loss01 函数进行减法运算。
      • 输出结果。

    问题定位

    1. 负号出现的原因

      • 负号的出现可能与 loss01 函数中的借位操作有关。如果借位操作不正确,可能会导致结果中间出现负号。
    2. 具体问题

      • loss01 函数中,借位操作可能会导致高位变为负数,从而在输出时显示为负号。

    解决方案

    1. 修改 loss01 函数

      • 确保借位操作正确,避免高位变为负数。
    2. 代码修改

      • loss01 函数中,增加对高位借位的处理,确保高位不会变为负数。

    修改后的代码

    #include <bits/stdc++.h>
    using namespace std;
    
    bool cmp(vector<int> &a, vector<int> &b) {
        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> loss01(vector<int> &a, vector<int> &b) {
        vector<int> C;
        int carry = 0; // 借位
        for (int i = 0; i < a.size(); i++) {
            int temp = a[i] - carry;
            if (i < b.size()) temp -= b[i];
            if (temp < 0) {
                temp += 10;
                carry = 1;
            } else {
                carry = 0;
            }
            C.push_back(temp);
        }
        // 去除前导零
        while (C.size() > 1 && C.back() == 0) C.pop_back();
        return C;
    }
    
    int main() {
        string A, B;
        vector<int> a, b, C;
        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)) {
            C = loss01(a, b);
        } else {
            C = loss01(b, a);
            cout << "-";
        }
        for (int i = C.size() - 1; i >= 0; i--) {
            cout << C[i];
        }
        return 0;
    }
    

    解释

    1. 借位处理

      • loss01 函数中,增加了一个 carry 变量来处理借位。每次减法操作后,检查当前位是否小于 0,如果是,则加上 10 并设置 carry 为 1。
    2. 去除前导零

      • loss01 函数中,增加了去除前导零的操作,确保结果不会出现多余的零。

    通过以上修改,可以确保高精度减法的结果不会在中间出现负号,并且结果正确。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月25日
  • 已采纳回答 7月17日
  • 创建了问题 7月16日