Google Code Jam 08 – Alien Numbers

Filed under C\C++\C#, General, Problems/Solutions, Programming, Source code, Tutorials
1 Star2 Stars3 Stars4 Stars5 Stars (3 votes, average: 5.00 out of 5)
Loading ... Loading ...

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 :P
I did it in C.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#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! :)

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*