Я делаю проект bigint, и я в тупике, почему мой оператор умножения не работает должным образом на тестовом примере.Оператор 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 = 858684 Что является правильным
Но когда я использую большие числа, то возникает проблема.
Пример:
432454 * 765534 = 330722436, которая не является правильным. Правильный ответ: 3.32 * 10^11
Есть небольшая часть, которую я оставил из тестового футляра – Josh
попробуйте использовать длинный или большой тип; в зависимости от того, насколько большой вы хотите получить, возможно, захотите начать использовать методы Фурье или алгоритм большого умножения, например toom-cook. –
Я попытался изменить короткий int на long int, но это не помогает – Josh