2014-01-15 2 views
1

Итак, что он должен делать, это иметь возможность принимать константу const char * str, чтобы изменить ее на 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 die, SO is forever. – genpfault

+2

То есть слишком много кода. – Borgleader

+0

Где вы обрабатываете отрицательные числа? И ваш код, хранящий материал «назад» в массиве, кажется обреченным на провал, с NUM_DIGITSD + 1/-1 случайным образом дробовиком повсюду. Сохраните LS-цифру в numArr [0] и не удерживайте их как символы от 0 'до' 9 ', удерживайте их как цифры 0-9. – Roddy

ответ

0

Это выглядит как «домашняя работа», но никак.

Возможно, вам удастся обнаружить отрицательные значения в конструкторе и сохранить эту информацию во флагах. Это облегчает решение о том, как использовать число в вычислениях. Как Родди сказал, что вам, вероятно, удастся сохранить цифры как цифры, а не символы, разумно, что вы будете выполнять больше вычислений, чем отображения в BigInt, и вам не нужно будет преобразовывать вещи для каждого вычисления, просто представьте, каково это было бы обрабатывать умножения и деления, как вы добавляете.

Возможно, вам удастся реализовать метод вычитания, прежде чем пытаться сделать «добавить» делать вычитание.

Я бы предположил, что у вас есть две основные проблемы с вычитанием: четыре перестановки знаков и «заимствование» вместо переноса.

Вы планируете использовать любой метод сравнения?

main() для тестирования даст вам больше пользы, если вы сохраните все свои тесты в нем. Главное в вашем вопросе имеет только одно утверждение. Если вы сохраняете утверждения для уже реализованной функциональности, вы гарантируете, что она будет работать, пока вы добавляете новое поведение. Постарайтесь выяснить свои кромки и провести тест для каждого. Также старайтесь помнить, что вам не нужно сразу реализовывать всю функциональность, проверяя небольшую часть, которую вы можете увидеть, как это сделать, может помочь вам разобраться в остальной части проблемы.

Функция «checkTest» возвращает логическое значение, использует его для подсчета количества неудавшихся тестов и возвращает это, чтобы дать вам возможность сбой сборки, когда какой-либо тест не выполняется.

Необходимо иметь возвращаемое значение, указывающее, не прошел ли какой-либо тест, потому что при более крупном тестировании теста ошибки будут исчезать в шуме, если они не «кричат» на вас, например. путем сбоя сборки.

Надеюсь, это поможет вам найти решение и узнать о проблеме.

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