// lihtne suurte naturaalarvude aritmeetika teek
// Margus Niitsoo, Ahto Truu

// naturaalarvu A esitame massiivina a[0..max],
// kus a[0] on üheliste number, a[1] kümneliste number jne
// see on üsna ebaefektiivne, aga väga mugav

#include <iostream>

typedef unsigned int uint;

class Suurarv
{

	static const uint maxp = 1000;

	unsigned char * s;

public:

	Suurarv() {
		s = new unsigned char[maxp];
	}
	Suurarv(uint a) {
		s = new unsigned char[maxp];
		*this = a;
	}
	Suurarv(const Suurarv & a) {
		s = new unsigned char[maxp];
		*this = a;
	}

	~Suurarv() {
		delete[] s;
	}

	Suurarv & operator=(uint a) {
		for (uint i = 0; i < maxp; i++) {
			s[i] = a % 10;
			a /= 10;
		}
		return *this;
	}
	Suurarv & operator=(const Suurarv & a) {
		for (uint i = 0; i < maxp; i++) {
			s[i] = a.s[i];
		}
		return *this;
	}

	Suurarv & operator+=(uint a) {
		uint i = 0;
		while (a > 0) {
			s[i] += a % 10;
			s[i+1] += s[i] / 10;
			s[i] %= 10;
			a /= 10;
		}
		return *this;
	}
	Suurarv & operator+=(const Suurarv & a) {
		for (uint i = 0; i < maxp-1; i++) {
			s[i] += a.s[i];
			s[i+1] += s[i] / 10;
			s[i] %= 10;
		}
		return *this;
	}

	Suurarv operator+(uint a) const {
		Suurarv t = *this;
		return t += a;
	}
	Suurarv operator+(const Suurarv & a) const {
		Suurarv t = *this;
		return t += a;
	}

	Suurarv & operator*=(uint a) {
		uint t = 0;
		for (uint i = 0; i < maxp; i++) {
			t += a * s[i];
			s[i] = t % 10;
			t /= 10;
		}
		return *this;
	}
	Suurarv & operator*=(const Suurarv & a) {
		return *this = *this * a;
	}

	Suurarv operator*(uint a) const {
		Suurarv t = *this;
		return t *= a;
	}
	Suurarv operator*(const Suurarv & a) const {
		Suurarv t = 0;
		for (uint j = 0; j < maxp; j++) {
			if (a.s[j] == 0) {
				continue;
			}
			for (uint i = 0; i < maxp-j-1; i++) {
				t.s[j+i] += a.s[j] * s[i];
				t.s[j+i+1] += t.s[j+i] / 10;
				t.s[j+i] %= 10;
			}
		}
		return t;
	}

	friend std::ostream& operator<<(std::ostream& out, const Suurarv & a);

};

std::ostream& operator<<(std::ostream& out, const Suurarv & a) {
	uint i = Suurarv::maxp-1;
	for (; i > 0; i--) {
		if (a.s[i] != 0) {
			break;
		}
	}
	for( ; i > 0; i--) {
		out << (char) (a.s[i] + '0');
	}
	return out << (char) (a.s[0] + '0');
}

int main(void)
{
	Suurarv a, b, c;

	a = 24;
	std::cout << a << std::endl;
	b = a;
	std::cout << b << std::endl;

	a += 1;
	std::cout << a << std::endl;
	a += b;
	std::cout << a << std::endl;

	c = a + 1;
	std::cout << c << std::endl;
	c = a + b;
	std::cout << c << std::endl;

	a *= 2;
	std::cout << a << std::endl;
	a *= b;
	std::cout << a << std::endl;

	c = a * 2;
	std::cout << c << std::endl;
	c = a * b;
	std::cout << c << std::endl;

	return 0;
}
