2015-12-27 106 views
-2

请检查此代码,并告诉我为什么是运营商+ =只适用于如果数字具有相同的大小,当我尝试x += z;i得到345678Bigint类运营商

我觉得问题是int for (i = 0; i <= len - 1; i++)循环。我试图解决它,但我没有成功。任何解决方案

头文件。

#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 file。

#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 + ='应该返回一个* reference *到当前对象,而不是一个新的对象。它应该是:'Mint&Mint :: operator + =(const Mint&rhs)' – PaulMcKenzie

回答

0

我已经写了三次大整数包。有一件事可以帮助我做很多事情,就是手工绘制算术图。尝试一下!

在这里的+=的情况下,问题发生在123 + = 4567之类的东西上。代码检查两个数组的长度,看到较大的一个是4,走到第一个的末尾,其中只有三个要素。所以不要调整lenrhs.num.size()

相反,那些加入operator+=另一个循环,两者之间存在:虽然没有进位和i小于rhs.size(),加rhs[i]carry,推动总和为*this。一旦代码处理了所有rhs,它就应该进入最后一个循环来处理任何剩余的进位。