hahahaYI3 2024-04-27 11:31 采纳率: 100%
浏览 5
已结题

高精度除法程序,求调

做了个高精度除法的程序
刚开始显示加法有问题
把"[i]"改成".at(i)"之后显示

img

Code:

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <Windows.h>
#include <stack>
#include <queue>
#include <fstream>
using namespace std;
string removeLeadingZeros(const std::string& str) {
    size_t pos = str.find_first_not_of('0');
    if (pos != std::string::npos) {
        return str.substr(pos);
    }
    return "0";
}
class BigNumber {
public:
    std::string number;
    int len;
    bool empty = true;
    BigNumber() {

    }
    BigNumber(int n) {
        number = std::to_string(n);
        len = number.size();
        empty = false;
    }
    BigNumber(std::string NewNum) {
        number = NewNum;
        len = NewNum.size();
        empty = false;
    }
    void Delete() {
        empty = true;
        number = "";
        len = 0;
    }
    char operator[](int b) {
        return number[b];
    }
    bool operator<(BigNumber a) {
        if (len < a.len)return true;
        if (len > a.len)return false;
        for (int i = len; i >= 0; i--)if (number[i] < a.number[i])return true; else if (number[i] > a.number[i])return false;
        return false;
    }
    bool operator>(BigNumber a) {
        if (len > a.len)return true;
        if (len < a.len)return false;
        for (int i = len; i >= 0; i--)if (number[i] > a.number[i])return true; else if (number[i] < a.number[i])return false;
        return false;
    }
    bool operator==(BigNumber a) {
        if (len != a.len)return false;
        for (int i = 0; i < len; i++)if (number[i] != a.number[i])return false;
        return true;
    }
    bool operator!=(BigNumber a) {
        if (BigNumber(number) == a)return false;
        return true;
    }
};
BigNumber a;
std::ostream& operator<<(std::ostream& output, BigNumber& num) {
    output << num.number;
    return output;
}
std::istream& operator >>(std::istream& input, BigNumber& num) {
    input >> num.number;
    num.len = num.number.size();
    num.empty = false;
    return input;
}
bool operator<=(BigNumber a, BigNumber b) {
    if (a < b or a == b)return true;
    return false;
}
bool operator>=(BigNumber a, BigNumber b) {
    if (a > b or a == b)return true;
    return false;
}
BigNumber operator+(BigNumber a, BigNumber b) {
    BigNumber* p;
    if (a.empty or b.empty)throw "BigNumber_Is_Empty";
    removeLeadingZeros(a.number);
    removeLeadingZeros(b.number);

    BigNumber c;
    c.empty = false;
    if (a.len != b.len) {
        int temp = max(a.len, b.len) - min(a.len, b.len);
        bool ABig = a.len > b.len;
        if (ABig)p = &a;
        else p = &b;
        for (int i = 0; i <= temp - 1; i++)p->number.insert(0, "0");

        bool flag = false;
        for (int i = a.len - 1; i >= 0; i++) {
            c.number[i] = a.number[i] + b.number[i] + flag - '0';
            flag = false;
            if (c.number[i] > '9')c.number.at(i) -= 10, flag = true;
        }
        if (flag)c.number.insert(0, "1");

        return c;
    }
}
BigNumber operator*(BigNumber a, BigNumber b) {
    int* A, * B;
    A = (int*)malloc(5050 * 4);
    B = (int*)malloc(5050 * 4);
    BigNumber D;
    for (int i = a.len; i >= 0; i--)A[a.len - i] = a[i] - '0';
    for (int i = b.len; i >= 0; i--)B[b.len - i] = b[i] - '0';
    for (int i = 1; i <= a.len; i++)for (int j = 1; j <= b.len; j++) D.number[i + j - 1] += a[i] * b[j];
    D.len = a.len + b.len;
    for (int i = 1; i <= D.len; i++) {
        D.number[i + 1] += D[i] / 10;
        D.number[i] %= 10;
    }
    for (; !D.number[D.len];)D.len--;
    std::string c;
    for (int i = max(1, D.len); i >= 1; i--) {
        c += D[i] + '0';
    }
    BigNumber C(c);
    return C;
}
BigNumber operator-(BigNumber num1, BigNumber num2) {
    int len1 = num1.len;
    int len2 = num2.len;
    if (len1 < len2)num1 = string(len2 - len1, '0') + num1;
    else if (len1 > len2)num2 = string(len1 - len2, '0') + num2;
    int borrow = 0;
    string result = "";
    for (int i = num1.len - 1; i >= 0; i--) {
        int digit1 = num1[i] - '0';
        int digit2 = num2[i] - '0';
        int diff = digit1 - digit2 - borrow;
        if (diff < 0) {
            diff += 10;
            borrow = 1;
        }
        else borrow = 0;
        result = to_string(diff) + result;
    }
    while (result.length() > 1 && result == "0")result = result.substr(1);
    a = result;
    a.len = a.number.size();
    return a;
}
BigNumber operator/(BigNumber a, BigNumber b) {
    BigNumber dividend = a.number;
    BigNumber divisor = b.number;
    BigNumber quotient, remainder;
    int len1 = dividend.number.length(), len2 = divisor.number.length();
    if (len1 < len2 || (len1 == len2 && dividend.number < divisor.number)) {
        quotient.number = "0";
        remainder = dividend;
    }
    else {
        BigNumber tmpDividend = dividend;
        int k = len1 - len2;
        divisor.number.append(k, '0');
        quotient.number.resize(k + 1);
        for (int i = k; i >= 0; i--) {
            while (tmpDividend.number.substr(i, len2) >= divisor) {
                tmpDividend = (tmpDividend.number.substr(0, i) + tmpDividend.number.substr(i + len2) - divisor) + tmpDividend.number.substr(i + len2);
                quotient.number[i] += 1;
            }
        }
        quotient.number.erase(0, min(quotient.number.find_first_not_of('0'), quotient.number.size() - 1));
        remainder = tmpDividend.number.erase(0, min(tmpDividend.number.find_first_not_of('0'), tmpDividend.number.size() - 1));
    }
    a = quotient;
    a.len = a.number.size();
    return a;
}
int main() {
    BigNumber a, b;
    cin >> a >> b;
    BigNumber c = a / b;
    cout << c.number;
}
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-27 11:31
    关注

    引自免费微信小程序:皆我百晓生

    在您的代码中,错误出现在operator/函数中的这个部分:

    while (tmpDividend.number.substr(i, len2) >= divisor) {
        tmpDividend = (tmpDividend.number.substr(0, i) + tmpDividend.number.substr(i + len2) - divisor) + tmpDividend.number.substr(i + len2);
        quotient.number[i] += 1;
    }
    

    这段代码试图执行两个字符串的减法操作,这是不允许的,因为substr返回的是一个子字符串,而不是可以直接进行数学运算的对象。

    为了修复这个问题,你需要将字符串转换为BigNumber对象,然后执行减法操作。下面是修改后的operator/函数代码:

    BigNumber operator/(BigNumber a, BigNumber b) {
        BigNumber dividend = a.number;
        BigNumber divisor = b.number;
        BigNumber quotient, remainder;
        int len1 = dividend.number.length(), len2 = divisor.number.length();
        
        if (len1 < len2 || (len1 == len2 && dividend.number < divisor.number)) {
            quotient.number = "0";
            remainder = dividend;
        }
        else {
            BigNumber tmpDividend = a;
            int k = len1 - len2;
            divisor.number.append(k, '0');
            
            quotient.number.resize(k + 1);
            for (int i = k; i >= 0; i--) {
                // Convert substrings to BigNumber objects and perform subtraction
                BigNumber subtrahend = BigNumber(divisor.number);
                BigNumber subtractor = BigNumber(tmpDividend.number.substr(i, len2));
    
                while (subtractor >= subtrahend) {
                    subtractor = subtractor - subtrahend;
                    quotient.number[i] += 1;
                }
    
                tmpDividend = tmpDividend - subtractor;
            }
            quotient.number.erase(0, min(quotient.number.find_first_not_of('0'), quotient.number.size() - 1));
            remainder = tmpDividend;
        }
        a = quotient;
        a.len = a.number.size();
        return a;
    }
    

    另外,在main()函数中,建议先检查输入的两个数是否都有效,例如它们都不能为空。这样可以避免因无效输入导致的运行时错误。以下是修改后的main()函数:

    int main() {
        BigNumber a, b;
        cin >> a >> b;
    
        // 检查输入有效性
        if (a.empty || b.empty) {
            cerr << "Error: One or both inputs are empty." << endl;
            return 1;
        }
    
        BigNumber c = a / b;
        cout << c.number;
        return 0;
    }
    

    现在这个高精度除法程序应该可以正常工作了。测试一下看看结果如何。如果有任何其他问题,请随时告诉我。

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

报告相同问题?

问题事件

  • 系统已结题 5月5日
  • 已采纳回答 4月27日
  • 创建了问题 4月27日

悬赏问题

  • ¥15 请问如何从gprmax中导出的merged.out文件获取雷达数据(应该是个二维数组吧),我看到网上很多对雷达数据的操作但是都没有说如何获得这个数据,因为out文件不能直接操作要转成其他格式是吧
  • ¥15 usb相机曝光度expos增加一点,获取图像速度显著变慢。
  • ¥15 如何解决如图问题:我创建的java maven项目中使用了03版本的excel,我先进行了文件读取的操作(可以正常取出,文件还未损坏),文件还未损坏),然后在进行了对同一文件的写入操作
  • ¥100 对接googlepay/googlewallet咨询
  • ¥15 Odoo 17系统中如何配置自动更新生产成本功能
  • ¥15 如何提取京东订单生成QQ支付链接
  • ¥50 游戏中的像素着色器获取到的法线贴图错误怎么解决
  • ¥15 把从欧空局下载的哨兵一号数据导入snap的时候出现这个问题该怎么解决😥
  • ¥15 蓝桥杯stm322016年省赛试题中遇到的问题
  • ¥15 有没有ND4J能用的MAVEN地址