2014-01-15 21 views
1

那麼它應該做的是能夠採取一個const char *海峽將其更改爲一個int,然後把它轉換回爲輸出字符串。但它也應該能夠將它們相加和相減。我通過了我的前兩個測試,但是我的加入正在進行中,它給了我一個接近答案的負數,但不是正確答案。縮短了一點。C++添加和減去100位的號碼

//For testing 
int main() 
{ 
BigInt result; 

BigInt num1("999"); 
BigInt num2("4873"); 
BigInt num3("-739"); 
checkTest("Test 1", "999", num1.convertToString()); 
checkTest("Test 2", "-739", num3.convertToString()); 
result = num3.add(num4); 
checkTest("Test 3", "-10610", result.convertToString()); 
return 0; 
} 

這裏就是我有麻煩

#include <iostream> 

using namespace std; 

class BigInt 
{ 
public: 

//An empty constructor, the {} is an empty body 
BigInt() {} 
BigInt(const char*); 
BigInt add(const BigInt&); 
BigInt operator+(const BigInt&); 
BigInt subtract(const BigInt&); 
BigInt operator-(const BigInt&); 
string convertToString(); 

private: 
static const int NUM_DIGITS = 100; 
int numArr[NUM_DIGITS + 1]; 
void tensComplement(); 
}; 
BigInt::BigInt(const char* str) { 
// TODO: CONVERT C-STRING TO BIGINT 
int len = strlen(str) - 1; 
int zero = NUM_DIGITS - 1; 
for (int i = 0; i < NUM_DIGITS; i++){ 
    numArr[i] = 48; 
} 
for (int i = len; i >= 0; i--){ 
    numArr[zero] = str[i]; 
    zero--; 
} 
} 

BigInt BigInt::add(const BigInt& rightOperand) { 
BigInt objToReturn("0"); 
// TODO: ADD LOGIC HERE 
int carry = 0; 
for (int i = 100; i > 0; i--){ 
    int left = this->numArr[i] - 48; 
    int right = rightOperand.numArr[i] - 48; 
    int total = left + right; 
    total += carry; 
    if (total > 9){ 
     carry = 1; 
    }else{ 
     carry = 0; 
    } 
    total = total % 10; 

    objToReturn.numArr[i] = total + 48; 
} 
//num1 is the this object 
cout << this->numArr[NUM_DIGITS]; 

//num2 is the rightOperand object 
cout << rightOperand.numArr[NUM_DIGITS]; 

return objToReturn; 
} 

BigInt BigInt::operator+(const BigInt& rightOperand){ 
return add(rightOperand); 
} 

string BigInt::convertToString(){ 
// TODO: VALUE IN numArr CONVERTED TO STRING 
int count = 0; 
string str; 
if(numArr[0] == 57){ 
    tensComplement(); 
} 
for (int i = 0; i < NUM_DIGITS; i++){ 
    if(numArr[i] == 48 && count == 0){ 

    }else{ 
     str.push_back(numArr[i]); 
     count++; 
    } 
} 
return str; 
} 

void BigInt::tensComplement(){ 
// TODO: TENS COMPLEMENT OF THIS NUMBER 
for (int i = 0; i <= 100; i++) { 
    numArr[i] = 9 - numArr[i]; 
} 
numArr[NUM_DIGITS] += 1; 
for(int i = NUM_DIGITS; i >= 1; i--){ 
    if(numArr[i] == 10){ 
     numArr[i] = 0; 
     numArr[i - 1] += 1; 
    } 
} 
if(numArr[0] == 1){ 
    numArr[0] = 9; 
} 
} 
//This helps with testing. 
bool checkTest(string testName, string whatItShouldBe, string whatItIs) { 

if (whatItShouldBe == whatItIs) { 
    cout << "Passed " << testName << " last digit was: " << whatItIs.at(whatItIs.length()-1) << endl; 
    return true; 
} 
else { 
    if (whatItShouldBe == "") { 
     cout << "**Failed test " << testName << " ** " << endl << " Output was "<< whatItIs << endl << " Output should have been blank. " << endl; 
    } else { 
     cout << "**Failed test " << testName << " ** " << endl << " Output was "<< whatItIs << endl << " Output should have been " << whatItShouldBe << endl; 
    } 
    return false; 
} 
} 
+3

-1,Pastebins死亡,SO永遠。 – genpfault

+2

這是太多的代碼。 – Borgleader

+0

你在哪裏處理負數?而你的代碼在數組中存儲'後退'似乎註定要失敗,NUM_DIGITSD + 1/-1隨機隨機發射。將LS數字存儲在numArr [0]中,並且不要將它們保留爲字符'0'至'9',將它們保存爲數字0-9。 – Roddy

回答

0

這看起來像「在家工作」,但任何方式。

你或許會從在構造函數中檢測負值和存儲在標誌信息中獲益。這使得更容易決定如何在計算中使用數字。 正如Roddy所說,你可能會將數字保留爲數字而不是字符,合理地說,你將會執行比BigInt中的顯示更多的計算,並且你不需要爲每次計算轉換東西,想象一下它會是什麼樣的處理方式像你這樣增加的乘法和除法。

你可能會從試圖使之前實施減方法中受益「添加」做減法。

我猜你有兩個主要的問題與減法, 的四個符號排列和「借用」,而不是隨身攜帶。

你是否計劃過任何比較方法?

的main()進行測試會給你更多的價值,如果你保存在它所有的測試。 你的問題中的主要只有一個斷言。 如果您爲已經實施的功能保留斷言,那麼確保它在您添加新行爲時保持工作。嘗試找出你的邊緣案例,併爲每個案例進行測試。 還要記住,你不需要一次執行整個功能,驗證一小段你可以看到如何去做可能會幫助你推斷其餘的問題。

你「checkTest」函數返回一個布爾值,用它來計算測試失敗的次數,並返回給你當任何測試失敗構建失敗的能力。

你需要有一個返回值告訴如有測試失敗,因爲在一個更大的版本測試,故障將在噪聲消失,除非他們「尖叫」你,例如通過失敗的構建。

我希望這可以幫助您找到解決方案並從問題中學習。