/** PROBLEMA: ========= The decimal numeral system is composed of ten digits, which we represent as "0123456789" (the digits in a system are written from lowest to highest). Imagine you have discovered an alien numeral system composed of some number of digits, which may or may not be the same as those used in decimal. For example, if the alien numeral system were represented as "oF8", then the numbers one through ten would be (F, 8, Fo, FF, F8, 8o, 8F, 88, Foo, FoF). We would like to be able to work with numbers in arbitrary alien systems. More generally, we want to be able to convert an arbitrary number that's written in one alien system into a second alien system. És a dir, el que hem de fer és un simple canvi de base, jo en faig dos: de la base d'entrada a decimal i de decimal a la base d'eixida. Va ser la solució més ràpida que vaig pensar a partir del canvi de base binari-decimal, crec que es pot fer tot d'un pas. */ #include #include #include #include using namespace std; /** Estructura amb la funció per a comparar dues cadenes. S'utilitza per a implementar el diccionari. */ struct ltstr{ bool operator()(char s1, char s2){ return s1 < s2; } }; /** Definició del diccionari. */ typedef map dic; /** Converteix del sistema d'entrada a decimal. */ int nbr2dec(string nbr, dic src){ int dec = 0; for(int i = 0; i < nbr.size(); i++){ dec += src[nbr[i]] * pow(src.size(), nbr.size() - i - 1); } return dec; } /** Converteix de decimal al sistema numèric de sortida. */ string dec2nbr(int dec, string tgt){ string str = ""; string str2 = ""; while(dec >= tgt.size()){ str += tgt[dec % tgt.size()]; dec /= tgt.size(); } str += tgt[dec]; for(string::reverse_iterator i = str.rbegin(); i < str.rend(); i++){ str2 += *i; } return str2; } int main(){ int cases; string nbr; string src; string tgt; dic src_dic; /** Diccionari de la base d'entrada, per edintificar ràpidament cada símbol. */ /** Llegim el número de casos de l'arxiu (condicions de Google) */ cin >> cases; for(int i = 0; i < cases; i++){ /** Llegim de l'entrada el nombre i la base d'entrada i la base de sortida. */ cin >> nbr >> src >> tgt; /** Creem el diccionari per a la base d'entrada. */ for(int j = 0; j < src.size(); j++) src_dic[src[j]] = j; /** Canviem de base i mostrem el resultat. */ cout << "Case #" << i+1 << ": " << dec2nbr(nbr2dec(nbr, src_dic), tgt) << "\n"; /** Borrem el diccionari. */ src_dic.clear(); } return 0; }