大整数除法表示为 C++ 中的字符串

Posted

技术标签:

【中文标题】大整数除法表示为 C++ 中的字符串【英文标题】:Division of Big Integers represented like string in c++ 【发布时间】:2015-10-31 13:24:40 【问题描述】:

编辑:现在下面的方法(除法函数)可以正常工作!

我正在研究 C++ 中的大整数除法。我已经编写了加法和减法函数,但是我遇到了除法问题。 这是 Big_Integer 类:

big_int.h
 char toChar(int num)
class Big_Int

public:
    Big_Int();                
    Big_Int(const Big_Int&);  
    Big_Int(string);          
    Big_Int& operator=(const Big_Int&);
    Big_Int operator+(const Big_Int&);
    friend Big_Int difference(const Big_Int&, const Big_Int&);
    friend Big_Int divide(const Big_Int&, long long);
    friend  Big_Int operator - (const Big_Int&, const Big_Int&);
    friend bool operator<(const Big_Int&, const Big_Int&);
    friend bool operator>(const Big_Int&, const Big_Int&);
    friend bool operator<=(const Big_Int& , const Big_Int&);
    friend bool operator>=(const Big_Int& , const Big_Int&);
    friend Big_Int operator/(const Big_Int&, long long);
    friend bool less_than(const Big_Int&, const Big_Int&);
    friend bool less_or_eq(const Big_Int&, const Big_Int&);
    friend bool operator==(const Big_Int&, const Big_Int&);
    friend ostream& operator<<(ostream& , const Big_Int&);
    friend istream& operator>>(istream&, const Big_Int&);

private:
    string number;
;

这是我的除法函数:

Big_Int divide(const Big_Int& in, long long den)

    string w_dvt = in.number;
    int carry = 0;
    string dvt = 0;
    string result;

while (!(w_dvt.empty()))

    if ((w_dvt[0] == '0') && (carry == 0))
    
        result += w_dvt[0];         
        w_dvt = w_dvt.substr(1);
    
    else 
        int i = 0;
        for (; i < w_dvt.size(); ++i)
        
            dvt += w_dvt[i];
            if (stoi(dvt) >= den) break;
        
                w_dvt = w_dvt.substr(i + 1);

        long long i_dvt = stoi(dvt);
        int res = i_dvt / den;
        carry = i_dvt%den;
        i_dvt = carry;
        dvt = to_string(i_dvt);
        result += toChar(res);
    

return Big_Int(result);
 
 Big_Int operator/(const Big_Int& in, long long den)
 
     Big_Int res = divide(in, den);
     return res;
 

char toChar(int num)

    char ch = '0'+ num ;
    return ch;

这里是主程序:

int main()

    string num1, num2;
    cin >> num1;
    Big_Int i1(num1);
    cin >> num2;
    Big_Int i2(num2);
    Big_Int divs = i1 / 8;
    cout << divs << endl; 

它编译得很好,但是当我尝试运行它时它会中止并显示一条消息:

"Expression: invalid null pointer"

我对我的程序进行了一些修改以消除该问题,但它仍然中止并显示相同的消息。如果有人对我的代码问题有任何想法,我将不胜感激。

【问题讨论】:

error C3861: 'toChar': identifier not found 在调试器中运行以捕获崩溃,并帮助定位它们在您的代码中发生的位置。如果您无法弄清楚,那么至少告诉我们崩溃发生在您的代码中的哪个位置,以及所有相关变量的值。 @Christian Hackl 我只发布了我的程序的一部分,toChar 在上面定义。 @stacy_stacy: ***.com/help/mcve friend 像 MM 一样在 facebook 上的列表,但 operator+ 是会员? 【参考方案1】:

抓挠:

string dvt = 0;

投入:

string dvt /*= 0*/ ;

至少

int main()

    Big_Int divs = Big_Int("42") / 8;
    cout << divs << endl; 

运行。

(我为Big_Int (string s)operator&lt;&lt; 添加了一些简单的实现)

编辑

一点解释:指向以零结尾的空 c 字符串的 char* 是 not - 无效 - (char*)(0);它是指向 (char)0 的有效指针。

【讨论】:

以上是关于大整数除法表示为 C++ 中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

java中的算数运算符有哪些?

什么是疯狂大整数除法的最快算法?

2737 大整数除法

C++的大数除法最快速度的算法

试除法分解大整数

LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化