/* lihtne suurte naturaalarvude aritmeetika teek */
/* Margus Niitsoo */

/* 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 <stdio.h>
#include <stdlib.h>

typedef unsigned char * suurarv;
typedef unsigned int uint;

const uint maxp = 1000;

suurarv uus_suurarv()
{
	return (suurarv) malloc(sizeof(char) * maxp);
}

void vabasta_suurarv(suurarv s)
{
	free(s);
}

void omista_v(suurarv kuhu, uint kust)
{
	uint j;
	for (j = 0; j < maxp; j++) {
		kuhu[j] = kust % 10;
		kust /= 10;
	}
}

void omista_s(suurarv kuhu, suurarv kust)
{
	uint j;
	for (j = 0; j < maxp; j++) {
		kuhu[j] = kust[j];
	}
}

void liida_v(suurarv millele, uint mis)
{
	uint j = 0;
	while (mis > 0) {
		millele[j] += mis % 10;
		millele[j+1] += millele[j] / 10;
		millele[j] %= 10;
		mis /= 10;
		j++;
	}
}

void liida_s(suurarv millele, suurarv mis)
{
	uint j;
	for (j = 0; j < maxp-1; j++) {
		millele[j] += mis[j];
		millele[j+1] += millele[j] / 10;
		millele[j] %= 10;
	}
}

/* väike arv peab olema vähemalt 10x väiksem enda max väärtusest */
void korruta_v(suurarv mis, uint millega)
{
	uint j, acc = 0;

	for (j = 0; j < maxp; j++) {
		acc += millega * mis[j];
		mis[j] = acc % 10;
		acc /= 10;
	}
}

void korruta_s(suurarv res, suurarv mis, suurarv millega)
{
	uint j, k;

	omista_v(res, 0);

	for (j = 0; j < maxp; j++) {
		if (millega[j] == 0) {
			continue;
		}
		for (k = 0; k < maxp-j-1; k++) {
			res[j+k] += millega[j] * mis[k];
			res[j+k+1] += res[j+k] / 10;
			res[j+k] %= 10;
		}
	}
}

void tryki(suurarv mis)
{
	uint j;
	for(j = maxp-1; j > 0; j--) {
		if (mis[j] != 0) {
			break;
		}
	}

	for( ; j > 0; j--) {
		fputc(mis[j]+'0', stdout);
	}
	fputc(mis[0]+'0', stdout);
}

int main(void)
{
	suurarv a = uus_suurarv();
	suurarv b = uus_suurarv();
	suurarv c = uus_suurarv();

	omista_v(a, 24);
	tryki(a); fputc('\n', stdout);
	omista_s(b, a);
	tryki(b); fputc('\n', stdout);

	liida_v(a, 1);
	tryki(a); fputc('\n', stdout);
	liida_s(a, b);
	tryki(a); fputc('\n', stdout);

	korruta_v(a, 2);
	tryki(a); fputc('\n', stdout);
	korruta_s(c, a, b);
	tryki(c); fputc('\n', stdout);

	vabasta_suurarv(a);
	vabasta_suurarv(b);
	vabasta_suurarv(c);

	return 0;
}
