Я пытаюсь реализовать Big Number в C++ со строками. Сначала я выполняю перегрузку оператора для оператора «+», добавление для длины цифр> 3 подходит правильно, но менее 3 дает значение мусора после результата. Я не понимаю, почему это происходит. Вот мой код.Реализация большого числа в C++
#include<iostream>
#include<cstring>
#define SIZE 100
using namespace std;
class BigNumber
{
char *chNumber;
long nLength,nMaxLength;
public :
BigNumber()
{
nLength = nMaxLength = 0;
Init();
}
BigNumber(long length)
{
nLength = length;
nMaxLength = length;
Init();
}
BigNumber(const char *str,long length)
{
nLength = strlen(str);
nMaxLength = length;
Init();
memset(chNumber,0,sizeof(char));
strncpy(chNumber,str,length);
}
/*** copy constructor **/
BigNumber(const BigNumber &source)
{
nLength = strlen(source.chNumber);
nMaxLength = source.nMaxLength;
if(source.chNumber)
{
Init();
strncpy(chNumber,source.chNumber,nLength);
}
else
chNumber = 0;
}
void Init()
{
chNumber = new char[nMaxLength + 5];
memset(chNumber,0,sizeof(char));
}
~BigNumber()
{
delete[] chNumber;
chNumber = 0;
nLength = 0;
}
char* getNumber()
{
return chNumber;
}
const long size() const
{
return nLength;
}
const long capacity() const
{
return nMaxLength;
}
friend long maxsize(BigNumber &obj1,BigNumber &obj2)
{
return (obj1.size() > obj2.size()) ? obj1.size():obj2.size();
}
friend ostream& operator<<(ostream &out,BigNumber &obj)
{
//out<<"String is "<<obj.chNumber<<" of length "<<obj.nLength
// <<" and max length allocated is "<<obj.nMaxLength;
out<<obj.chNumber;
return out;
}
friend istream& operator>>(istream &in,BigNumber &obj)
{
obj.Init();
in>>obj.chNumber;
obj.nLength = strlen(obj.chNumber);
return in;
}
BigNumber &operator=(const BigNumber &obj)
{
if(this == &obj)
{
return *this;
}
delete[] chNumber;
chNumber = 0;
nLength = strlen(obj.chNumber);
Init();
strncpy(chNumber,obj.chNumber,nLength);
return *this;
}
void operator=(char * str)
{
nLength = strlen(str);
Init();
strncpy(chNumber,str,nLength);
}
friend BigNumber reverse(const BigNumber &obj1)
{
long length = obj1.size();
int m=0;
BigNumber obj2(length+5);
for(int i=length-1;i>=0;--i)
{
obj2.chNumber[m++]=obj1.chNumber[i];
}
obj2.chNumber[m]='\0';
//cout<<obj2.chNumber<<endl;
obj2.nLength = m;
return obj2;
}
friend BigNumber operator+(BigNumber &obj1,BigNumber &obj2)
{
long newLength = maxsize(obj1,obj2);
BigNumber obj3(newLength + 5);
int length1 = obj1.size();
int length2 = obj2.size();
int i,j,carry=0,num,m=0;
for(i=length1-1,j=length2-1; i>=0 || j>=0 ; --i,--j)
{
if(i>=0 && j>=0)
{
num = (obj1.chNumber[i]-'0') + (obj2.chNumber[j]-'0') + carry;
}
else if(i>=0)
{
num = obj1.chNumber[i] - '0' + carry;
}
else if(j>=0)
{
num = obj2.chNumber[j] - '0' + carry;
}
carry = num/10;
num = num%10;
obj3.chNumber[m++] = num+'0';
}
obj3.chNumber[m]='\0';
obj3.nLength = m;
BigNumber obj4 = reverse(obj3);
cout<<obj4<<endl;
return reverse(obj3);
}
};
void test_addition()
{
BigNumber n1("42",3),n2("1",2),n3;
n3 = n1 + n2;
cout<<n3<<endl;
n1 = "123";
n2 = "345";
n3 = n1 + n2;
cout<<n3<<endl;
}
int main()
{
test_addition();
return 0;
}
Перед возвращением из оператора функции +(), я печать суммы его дает правильный вывод и после возвращения я печать даю значение барахла после результата.
Спасибо
Найти случай, когда сумма неверна и выполнить операцию добавления с помощью отладчика. Кроме того, добавьте инструкции печати в эту функцию, чтобы помочь вам понять, что происходит не так. Если есть поведение кода, которое вы не можете объяснить, отправьте его здесь. – Pradhan
Я думаю, вам нужно посмотреть на ваши конструкторы и оператор присваивания из 'char *'. Я не думаю, что вы последовательно устанавливаете длины, и у вас, вероятно, возникают проблемы, связанные с этим. –
@Pradhan Возможно, вы должны дать полезный комментарий относительно проблемы, а не инструменты отладки, ни в коем случае сумма не ошибается, вы можете проверить, что в операторе +(), верните реверс (obj3) перед возвратом, возможно, у вас нет проверил мой код, где его неправильно. – avinashse