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.
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!

