2015-12-27 2 views
-2

Пожалуйста, ознакомьтесь с этим кодом и сообщите, почему оператор + = работает только в том случае, если номера имеют одинаковый размер, когда я пытался x += z;i получил 345678.Оператор класса Bigint

Я думаю, что проблема int for (i = 0; i <= len - 1; i++) loop. Я попытался это исправить, но мне не удалось. Любые решения?

Файл заголовка.

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

class Mint { 
public: 

    Mint(); 
    Mint(int); 
    Mint (const char *s); 
    string afficher(); 
    Mint operator+=(const Mint &rhs); //returns mint + rhs 
    Mint operator+(const Mint &rhs); 
private: 
    vector<char> num; 
}; 

Исходный файл.

#include "Mint.h" 
#include <string.h> 

Mint::Mint() 
{ 
    num.push_back(0); 
} 
Mint::Mint(int n) 
{ 
    while(n!=0) 
    { 
     num.push_back(n%10); 
     n = n/10; 
    } 
} 
Mint::Mint(const char* s) 
{ 
    int i = 0 ; 
    for(i=strlen(s)-1;i>=0;i--) 
    num.push_back(s[i] - '0'); 
} 
string Mint::afficher(){ 
    string s=""; 
    int i; 
    for(i=num.size()-1;i>=0;i--) 
     s += char('0'+num[i]); 
    return s; 
} 
Mint Mint::operator+=(const Mint &rhs) { 
    unsigned int len = num.size(); 
    char carry = 0; 

    if (len > rhs.num.size()) 
     len = rhs.num.size(); 

    unsigned int i; 
    for (i = 0; i <= len - 1; i++) 
    { 
     char result = num[i] + rhs.num[i] + carry; 
     num[i] = result % 10; 
     carry = result/10; 
    } 

    while (carry) 
    { 
     if (i < num.size()) 
     { 
      num[i] += carry; 
      if (num[i] >= 10) 
      { 
       num[i] -= 10; 
       i++; 
      } 
      else 
       carry = 0; 
     } 
     else { 
      num.push_back(carry); 
      carry = 0; 
     } 
    } 
    return *this; 
} 
Mint Mint::operator+(const Mint &rhs){ 
    Mint result; 
    result = *this; 
    return result+=rhs; 
} 

main файл.

#include "Mint.h" 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    Mint x="123456",z="22222222222222222222",f; 
    Mint a = "655478461469974272005572"; 
    Mint b = 8; 
    x += z; 
    f = x + z; 
    cout << x.afficher()<<endl; 

} 
+0

Что вы видите, когда запускаете его в отладчике? –

+0

Если len == 0, то len -1 может стать максимальным значением unsigned int – I3ck

+0

'operator + =' должно возвращать * ссылку * на текущий объект, а не на новый объект. Это должно быть: 'Mint & Mint :: operator + = (const Mint & rhs)' – PaulMcKenzie

ответ

0

Я сейчас написал большие целые пакеты три раза. Одна вещь, которая мне очень помогает, - это сделать арифметику вручную. Попробуй!

В случае += здесь проблема возникает из-за чего-то вроде 123 + = 4567. Код смотрит на длину обоих массивов, видит, что больше один - 4, и уходит с конца первого, который имеет только три элемента. Поэтому не настраивайте len на rhs.num.size().

Вместо этого добавьте еще один цикл в operator+=, между ними, что есть: в то время как есть кэрри и i меньше rhs.size(), добавьте rhs[i] и carry и нажмите сумму в *this. После того, как код обработал все rhs, он должен пройти до конечного цикла для обработки любых оставшихся переносов.

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