Кажется, я нашел твою проблему - ты не убираешь за собой. То есть каждый раз, когда вы вводите новый номер, он также использует некоторые из старых номеров.
Существует несколько возможных решений этой проблемы. Самый простой (с некоторыми исправлениями кода) выглядит следующим образом:
Создайте метод clear
где-то в вашем классе:
void Bigint::clear()
{
for (int i = DIGITS-1; i >= 0; --i)
digits_[i] = 0;
}
Удалите конструктор по умолчанию (это необязательно, ноон избыточен), и замените другое на это:
Bigint::Bigint(int radix = 10) : radix{radix}
{
clear();
}
И добавьте следующее в начале вашего оператора ввода:
istream& operator>> (istream& in, Bigint& n)
{
clear(); //This is the important one!!!!
string s;
if (in >> s) {
...
...
}
Есть и другие возможные решения:
Вы можете добавить члена int length;
в свой класс. У вас уже есть эта длина в вашем операторе ввода, вам просто нужно сохранить ее и использовать во всех ваших вычислениях.
Еще лучше, измените digits_
на std::vector<int> digits_;
. Это позволит вам избавиться от функции clear
, оставив ваш конструктор пустым (только с инициализацией члена). Вам просто нужно будет позвонить digits_.clear();
в начале вашего оператора ввода. И используйте digits_.push_back(...);
вместо того, чтобы возиться с индексами.
Но самое правильное решение (хотя изменение должно быть сделано в любом случае std::vector<int>
) это просто стереть ваш оператор ввода и изменить вашBigint::Bigint
принять строку. То есть:
Bigint::Bigint(std::string s, int radix = 10) : radix{radix}
{
const int length = s.length();
for (int i = 0; (i < DIGITS) && (i < length); ++i)
n.digits_[i] = int(s[length()-1 - i] - '0');
}
После этого в своем основном вы просто делаете это:
void main(...)
{
....
char op;
std::string s1, s2;
while (cin >> s1 >> op >> s2)
{
Bigint n1 {s1, radix};
Bigint n2 {s2, radix};
switch (op) {
.....
}
}
}
Это имеет следующие преимущества:
Я бы настоятельно рекомендовал заменить ваш digits_
на std::vector<int>
. Преимущество будет в том, чтобы принимать число любого размера, поскольку вектор может увеличиваться настолько, насколько вам это необходимо. Это также сделает ваш код преобразования строки в int намного проще. И сделать вас умножить проще, поскольку вы можете легко добавлять нули в конец и начало вектора с помощью простой операции. И избежал бы множества других ошибок. Просто измените его на std::vector<int>
! ; -)
Также обратите внимание, что using namespace std;
- это плохая практика: Почему «используется пространство имен std;»считается плохой практикой?