Photolog

Through the Looking-Glass
2010-10-12: Through the Looking-Glass
My radio speaks is binary!
2010-10-10: My radio speaks is binary!
Gigaminx: (present for my birthday)
2010-09-16: Gigaminx: (present for my birthday)
Trini on bike
2010-09-05: Trini on bike
Valporquero
2010-08-28: Valporquero
My new bike!
2010-08-22: My new bike!
Mario and Ana's wedding
2010-08-13: Mario and Ana's wedding
Canyoning in Guara
2010-08-07: Canyoning in Guara
Trini and Mari in Marbella
2010-08-05: Trini and Mari in Marbella
Trini and Chelo in Tabarca
2010-08-03: Trini and Chelo in Tabarca
Valid XHTML 1.1
Log in
Back to list of problems

Numerically Speaking

619.c

/* Numerically Speaking */
#include <stdio.h>

typedef struct {
	int len;
	int num[50];
} big;

big number;
big letter;

void
sum(big *a, int n, int base) {
	int i;

	for(i=0; i<a->len; i++) {
		a->num[i] += n;
		n = (a->num[i] / base);
		a->num[i] %= base;
	}
	while (n) {
		a->num[a->len] = (base==26 ? n-1 : n);
		n /= base;
		a->num[a->len] %= base;
		a->len++;
	}
}

void
mul(big *a, int n, int base) {
	int i;

	for(i=0; i<a->len; i++) {
		if (base==26) {
			a->num[i] = (a->num[i]+1) * n - 1;
		} else {
			a->num[i] *= n;
		}
	}
	n=0;
	for(i=0; i<a->len; i++) {
		a->num[i] += n;
		n = (a->num[i] / base);
		a->num[i] %= base;
	}
	while (n) {
		a->num[a->len] = (base==26 ? n-1 : n);
		n /= base;
		a->num[a->len] %= base;
		a->len++;
	}
}

void
num2letters() {
	int i;

	letter.len = 0;
	for(i=number.len-1; i>=0; i--) {
		mul(&letter, 10, 26);
		sum(&letter, number.num[i], 26);
	}
}

void
letters2num() {
	int i;

	number.len = 0;
	for(i=letter.len-1; i>=0; i--) {
		mul(&number, 26, 10);
		sum(&number, letter.num[i], 10);
		sum(&number, 1, 10);
	}
}

int
main(void) {
	char buf[1024];

	while(scanf("%s", buf)==1) {
		int i;
		if (!strcmp(buf, "*")) {
			break;
		}

		if (buf[0]>='0' && buf[0]<='9') {
			number.len = strlen(buf);
			for(i=0; i<number.len; i++) {
				number.num[i] = buf[number.len-i-1]-'0';
			}
			num2letters();
		} else {
			letter.len = strlen(buf);
			for(i=0; i<letter.len; i++) {
				letter.num[i] = buf[letter.len-i-1]-'a';
			}
			letters2num();
		}
		for(i=letter.len-1; i>=0; i--) {
			printf("%c", 'a'+letter.num[i]);
		}
		printf("%.*s", 22-letter.len,
				"                                                       ");
		for(i=number.len-1; i>=0; i--) {
			printf("%c", '0'+number.num[i]);
			if (i && (i%3==0)) {
				printf(",");
			}
		}
		printf("\n");
	}

	exit(0);
}