#include<iostream>
#include<cstdlib>
#include<cstring>

class Numero {
	private:
		char* dig;
		int   nd;

	public:
		Numero(const char* n="0");
		Numero(const Numero&);
		Numero(int t);
		~Numero(void);
		int   ndig(void) const { return nd; };
		char  operator [] (int k) const;
		char& operator [] (int k)       { return dig[k]; };
};

Numero::Numero(const char* n)
{
	nd= strlen(n);
	dig= new char[nd+1];
	for (int i=0, k=nd-1; k>=0; --k, ++i)
		dig[i]= n[k]-'0';	
}

Numero::Numero(int t)
{
	nd= t;
	dig= new char[t+1];
	for (int i=0; i<t; ++i)
		dig[i]= 0;	
}

Numero::Numero(const Numero& a)
{
	nd= a.ndig();
	dig= new char[nd];
	for (int k=0; k<nd; ++k)
		dig[k]= a[k];
}


Numero::~Numero(void)
{
	delete [] dig;
	nd= 0;
}

char  Numero::operator [] (int k) const 
{ 
	return k<nd ? dig[k] : 0; 
};

std::ostream& operator << (std::ostream& out, const Numero& n)
{
	for (int k=n.ndig()-1; k>=0; --k)
		out << char(n[k]+'0');
	return out;
}

Numero operator + (const Numero& a, const Numero& b)
{
	int nda= a.ndig();
	int ndb= b.ndig();
	int nr= nda >= ndb ? nda : ndb;
	Numero r(nr);

	int acarreo=0;
	for (int k=0; k<nr; ++k) {
		int t= a[k] + b[k] + acarreo;
		if (t>=10) {
			acarreo= 1;
			t-= 10;
		}
		else
			acarreo= 0;
		r[k]= t;
	}

	return r;
}


int main(int argc, char *argv[])
{
	Numero p("12345");
	Numero q("876");
	Numero r= p+q;
	std::cout << p+q << std::endl;
	return EXIT_SUCCESS;
}




