Hi there
Here is my solution for the first practice exercise of Google Code Jam 2008, called Alien Numbers.
I haven’t had much time to code recently, due to exams, but didn’t resist and took a look at the first exercise ![]()
I did it in C.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Constants
#define min_size_number 1
#define min_size_input_lang 2
#define min_size_target_lang 2
#define max_size_number 4
#define max_size_input_lang 10
#define max_size_target_lang 10
//Multiplies a number for itself e times
int exponent(int number, int e)
{
int n=1;
while (e>0)
{
n = n * number;
e--;
}
return n;
}
//Converts a number in a given base, to base 10
int fromXto10(char * number, char * base)
{
//Variables
int i, j, n, decNumber=0, e, baseNumber = strlen(base); //Int variables
//Get maximum exponent in number (0-n)
e = strlen(number)-1;
//Go through the number
for (i=0;i<strlen(number);i++)
{
//Get the decimal number of the current symbol, using input base
for (j=0;j<strlen(base);j++)
{
if (number[i]==base[j])
{
n = j;
break;
}
}
//Get decimal number
decNumber += n * exponent(baseNumber, e);
e--;
}
//Return decimal number
return decNumber;
}
char * from10toX(int number, char * base)
{
//Variables
int i, divRes, rest, baseNumber = strlen(base); //Int variables
char * Xnumber; //String variables
//Calculate space needed for X number
i=0;
divRes = number;
while (divRes>0)
{
divRes = divRes / baseNumber; //Divide
i++;
}
//Allocate space for Xnumber (i=number of digits)
Xnumber = (char*) malloc((sizeof(char)+1)*i);
Xnumber[i] = '\0';
//Go through the number
divRes = number;
while (divRes>0)
{
rest = divRes % baseNumber; //Get rest (last digit in target language)
divRes = divRes / baseNumber; //Divide
//Convert r to target digit, and put it in Xnumber (starts from the end)
Xnumber[i-1] = base[rest];
i--;
}
//Return X number
return Xnumber;
}
int main()
{
//Variables
FILE * fin, * fout; //Input file
int totalCases=0, i, dec; //Int variables
char number[max_size_number], inputLang[max_size_input_lang], targetLang[max_size_target_lang], * targetNumber; //String variables
//Open file for reading
fin = fopen("A-small.in", "r");
fout = fopen("output.in", "w");
if (fin==NULL) return 0;
//Get total numbers of cases
fscanf(fin, "%d", &totalCases);
//Go through all cases
for (i=0;i<totalCases;i++)
{
//Get case
fscanf(fin, "%s %s %s", number, inputLang, targetLang);
//Convert from input to decimal
dec = fromXto10(number, inputLang);
//Convert from decimal to target and print
targetNumber = from10toX(dec, targetLang);
printf("Case #%d: %s\n", i+1, targetNumber);
fprintf(fout, "Case #%d: %s\n", i+1, targetNumber);
}
return 0;
}
Take care! ![]()

