2015-10-31 3 views
-1

EDIT: Теперь метод (функция деления) ниже работает правильно!Отдел больших целых чисел, представленных как строка в C++

Я работаю над разделением больших целых чисел в 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" 

Я внес некоторые изменения в свою программу, чтобы устранить эту проблему, но она по-прежнему прерывается с тем же сообщением. Если у кого-нибудь есть идеи относительно проблемы с моим кодом, я был бы признателен.

+1

'ошибка C3861: 'toChar': идентификатор не найден' –

+1

Запуск в отладчике для сбоя сбоев и помощь в поиске места, где они происходят в вашем коде. Если вы не можете понять это, то по крайней мере сообщите нам, где в вашем коде произошел сбой, и значения всех задействованных переменных. –

+0

@ Chhristian Hackl Я опубликовал только часть моей программы, toChar определен выше. –

ответ

1

царапанье:

string dvt = 0; 

сдачи:

string dvt /*= 0*/ ; 

составляет, по меньшей мере

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

перспективе.

(я добавил тривиальные impls для Big_Int (string s) и operator<<)

EDIT

Немного ПОЯСНЕНИЕ: символ *, указывающий на ноль с завершающей пустой с-струну не ан - недействительно - (символ *) (0); Это действительный указатель, который указывает на (char) 0.