Big Integers的分区在c ++中表示为字符串

时间:2015-10-31 13:24:41

标签: c++ string pointers biginteger division

编辑:现在,下面的方法(除法功能)工作正常!

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

PigStorage(',','-tagFile')

这是我的除法功能:

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; 
}

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

1 个答案:

答案 0 :(得分:1)

刮伤:

string dvt = 0;

把:

string dvt /*= 0*/ ;

至少

int main()
{
    Big_Int divs = Big_Int("42") / 8;
    cout << divs << endl; 
}

运行。

(我为Big_Int (string s)operator<<添加了微不足道的动作

修改

一个小解释:指向零终止空c字符串的char *是和 - 无效 - (char *)(0);它是一个指向(char)0的有效指针。