bigint — C ++ сложение и вычитание 100-значных чисел

Итак, что он должен делать, это иметь возможность принимать const char * str, заменять его на int и затем преобразовывать обратно в строку для вывода. Но это также должно быть в состоянии сложить и вычесть их вместе. Я сдаю свои первые два теста, но с моим добавлением что-то происходит, это дает мне отрицательное число, близкое к ответу, но не правильное. Немного укоротил.

//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;
}
}

1

Решение

Это похоже на «домашнюю работу», но в любом случае.

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

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

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

Вы планировали какой-либо метод сравнения?

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

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

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

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

0

Другие решения

Других решений пока нет …