Бигинт * оператор

Я делаю проект bigint, и я озадачен, почему мой оператор умножения не работает должным образом в тестовом примере.

Я исключаю .h файл, потому что он, вероятно, не нужен.

bigint.cpp:

// Definition of multiplication operator
BigInt BigInt::operator*(BigInt addend2)
{
BigInt product;
short int first,                  // a block of 1st addend (this object)
second,                 // a block of 2nd addend (addend2)
result,                 // a block in their sum
carry = 0;              // the carry in adding two blocks

list<short int>::reverse_iterator // to iterate right to left
it1 = myList.rbegin(),         //   through 1st list, and
it2 = addend2.myList.rbegin(); //   through 2nd list

while (it1 != myList.rend() || it2 != addend2.myList.rend())
{
if (it1 != myList.rend())
{
first = *it1;
it1++ ;
}
else
first = 0;
if (it2 != addend2.myList.rend())
{
second = *it2;
it2++ ;
}
else
second = 0;

short int temp = first * second;
result = temp % 1000;
carry = temp / 1000;
product.myList.push_front(result);
}

if (carry > 0)
product.myList.push_front(carry);

return product;
}

Main.cpp (контрольный пример):

int main()
{
char response;
do
{
cout << "\nMultiplication part:" << endl;
cout << "The multiplication of\n\t"<< number1 << " * " << number2
<< "\nis\n\t" << number1 * number2 << endl;

cout << "\nAdd more integers (Y or N)? ";
cin >> response;
}

Когда я запускаю код, умножение неверно.

Ниже приведен пример прогона:
Умножение 123 * 423 равно -507, что явно не правильно.

Я почти уверен, что перепутал определение умножения, но кто-нибудь может сказать, где я запутался?

Изменить: Просто сообщая всем, мой код компилируется, но продукт иногда не так.
Я также меняю все свои короткие int на long int.

Например:

978 * 878 = 858 684 Что правильно

Но когда я использую большие числа, тогда возникает проблема.

Пример:

432 454 * 765 534 = 330 722 436, что неверно. Правильный ответ 3.32 * 10 ^ 11

0

Решение

Не использовать short int для ваших промежуточных значений: 1000 * 1000 скорее всего переполнится коротким. использование intи в идеале где-то static_assert(1000 * 1000 <= std::numeric_limits<int>::max()), "oops - int is too small!");,

123 * 423 = 52029. На двухкомпьютерной машине с 16-битными шортами беззнаковая короткая (52029) = -13507. -13507% 1000 = -507. Я не уверен, что случилось с керри. хоть.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector