Jak nauczył mnie tegoroczny konkurs o dziką kartę NMC trzeba zawsze mieć konwerter wszystkich możliwych systemów liczenia,
bowiem liczenie zadania na 5 konwersji kilkucyfrowych liczb i jednego XORa to wystarczający powód by się lekko zdenerowować 😉
Zadanie brzmiało:
7. Wybierz poprawny wynik operacji 3A995(11) XOR 153262(7)
a. 799A(17)
b. 13BB3(13)
c. B024(15)
Cóż, nie ma co się załamywać, tylko trzeba pisać program i mieć go potem cały czas przy sobie. Kod, który jakiś czas temu powstał
jest dość prosty i ograniczony do cyfr jako 0..Z i maksymalnym zakresie longa (czyli 10 cyfr), jednak dla bezpieczeństwa
dałem long longa – nigdy nie wiadomo na czym przyjdzie kompilować kod.
Talk is cheap, I’ll show you the code
Dwa kawałki są najbardziej istotne:
1.konwersja na dziesiętny:
long long ll = 0, a; //a=tmp char c; int len = x.length(); for (int i = 0; i < len; i++){ c = x[len - i - 1]; c = toupper(c); if (c >= 48 && c <= 57) a = c - 48; else if (c >= 65 && c <= 90) a = c - 55; ll += a * pow(b, i); } return ll;
2.konwersja z dziesiętnego
string w = " "; //statyczna dlugosc na 32 - max cyfr w tej specyfikacji long long c = x; int i = 32; int t; while (i >= 0){ t = c % b; if (t < 10) w[--i] = 48 + t; else w[--i] = 55 + t; //czy koniec dzieleń? if ((float) (c / b) >= 1) c /= b; else break; } //utnij spacje poczatkowe int j; for (j = 0; j < 32; j++) if (w[j] != ' ') break; w = w.substr(j); return w;
Całość do pobrania poniżej.