2013-07-19 227 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,這顯然是不正確的。

我很確定我弄亂了乘法的定義,但任何人都可以說我弄亂了什麼地方?

編輯:只要讓每個人都知道,我的代碼可以編譯,但產品有時是錯誤的。 我也將我所有的短整型變爲長整型。

例如:

978 * 878 = 858684這是正確的

但是,當我用更大的數字則出現問題。

實施例:

432454 * 765534 = 330722436這是不正確的。正確答案是3.32 * 10^11

+0

有一小部分我遺漏了測試用例 – Josh

+1

嘗試使用longs或者更大的類型;取決於你希望得到多大,你可能想開始使用傅里葉方法或像intom-cook這樣的大整數乘法算法。 –

+0

我試過改變短整型爲長整型,但這並沒有幫助 – 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