高精度除法一直得到0
  • 板块学术版
  • 楼主lzy20091001
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/6/2 13:28
  • 上次更新2023/10/23 14:06:34
查看原帖
高精度除法一直得到0
932039
lzy20091001楼主2023/6/2 13:28

如题,我的高精度基本就是照着大佬的代码写的,按照我个人的习惯做了些许的修改(修改了变量名和一些运算,原来除法的函数我把它分成了做整除和取模),结果就不对了

貌似是dynamic_dividend(相当于原来代码的tempstr)这个变量出了问题,自己在调试时输出这个变量得到的是空字符串。

求解

#include <iostream>
#include <string>
using namespace std;

int cmp(string, string);
string add(string, string);
string sub(string, string);
string mul(string, string);
string div(string, string);
string mod(string, string);

int main()
{
std:
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    string a, b;
    cin >> a >> b;
    cout << add(a, b) << "\n"
         << sub(a, b) << "\n"
         << mul(a, b) << "\n"
         << div(a, b) << "\n"
         << mod(a, b) << "\n";
    return 0;
}

int cmp(string str1, string str2)
{
    if (str1.length() < str2.length())
        return -1;
    if (str1.length() > str2.length())
        return 1;
    return str1.compare(str2);
}

string add(string str1, string str2)
{
    string str = "";
    int str1_len = str1.length(), str2_len = str2.length(), temp = 0;
    bool carry = 0;
    if (str1_len < str2_len)
        for (int i = 1; i <= str2_len - str1_len; i++)
            str1 = '0' + str1;
    else
        for (int i = 1; i <= str1_len - str2_len; i++)
            str2 = '0' + str2;
    str1_len = str1.length(), str2_len = str.length();
    for (int i = str1_len - 1; i >= 0; i--)
    {
        temp = str1[i] - '0' + str2[i] - '0' + carry;
        carry = temp / 10;
        temp %= 10;
        str = char(temp + '0') + str;
    }
    if (carry == 1)
        str = '1' + str;
    return str;
}

string sub(string str1, string str2)
{
    string str = "";
    int str1_len = str1.length(), str2_len = str2.length(), temp = 0;
    bool carry = 0;
    if (str1_len < str2_len)
        for (int i = 1; i <= str2_len - str1_len; i++)
            str1 = '0' + str1;
    else
        for (int i = 1; i <= str1_len - str2_len; i++)
            str2 = '0' + str2;
    str1_len = str1.length(), str2_len = str2.length();
    for (int i = str1_len - 1; i >= 0; i--)
    {
        temp = (str1[i] - '0') - (str2[i] - '0') - carry;
        if (temp < 0)
        {
            carry = 1;
            temp += 10;
        }
        else
            carry = 0;
        str = char(temp + '0') + str;
    }
    str.erase(0, str.find_first_not_of('0'));
    if (str.empty())
        str = "0";
    return str;
}

string mul(string str1, string str2)
{
    string str = "", temp_num = "";
    int carry = 0, temp_digit = 0;
    int str1_len = str1.length(), str2_len = str2.length();
    for (int i = str2_len - 1; i >= 0; i--)
    {
        temp_num = "";
        temp_num.insert(0, str2_len - 1 - i, '0');
        for (int j = str1_len - 1; j >= 0; j--)
        {
            temp_digit = (str2[i] - '0') * (str1[j] - '0') + carry;
            carry = temp_digit / 10;
            temp_digit %= 10;
            temp_num = char(temp_digit + '0') + temp_num;
        }
        if (carry != 0)
            temp_num = char(carry + '0') + temp_num;
        str = add(str, temp_num);
    }
    str.erase(0, str.find_first_not_of('0'));
    if (str.empty())
        str = "0";
    return str;
}

string div(string str1, string str2)
{
    string str = "";
    int str1_len = str1.length(), str2_len = str2.length();
    if (str2 == "0")
        str = "ERROR";
    else if (str1 == "0")
        str = "0";
    else if (cmp(str1, str2) < 0)
        str = "0";
    else if (cmp(str1, str2) == 0)
        str = "1";
    else
    {
        string dynamic_dividend = "";
        dynamic_dividend.append(str1, 0, str2_len - 1);
        for (int i = str2_len - 1; i < str1_len; i++)
        {
            dynamic_dividend += str1[i];
            dynamic_dividend.erase(0, dynamic_dividend.find_first_not_of('0'));
            if (dynamic_dividend.empty())
                dynamic_dividend = "0";
            for (char ch = '9'; ch >= '0'; ch--)
            {
                string temp = mul(str2, ("" + ch));
                if (cmp(temp, dynamic_dividend) <= 0)
                {
                    str += ch;
                    dynamic_dividend = sub(dynamic_dividend, temp);
                    break;
                }
            }
        }
        str.erase(0, str.find_first_not_of('0'));
        if (str.empty())
            str = "0";
    }
    return str;
}

string mod(string str1, string str2)
{
    string str;
    str = sub(str1, mul(div(str1, str2), str2));
    return str;
}
2023/6/2 13:28
加载中...