2013-07-19 4 views
0

Я делаю проект 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

+0

Есть небольшая часть, которую я оставил из тестового футляра – Josh

+1

попробуйте использовать длинный или большой тип; в зависимости от того, насколько большой вы хотите получить, возможно, захотите начать использовать методы Фурье или алгоритм большого умножения, например toom-cook. –

+0

Я попытался изменить короткий int на long int, но это не помогает – Josh

ответ

1

Не используйте 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. Я не уверен, что случилось с переносом. хоть.

+0

Я все еще немного смущен, что делать? Я попытался изменить все малые int на int, но умножение по-прежнему не так. – Josh

Смежные вопросы