Ciekawe zadanie programistyczne, które umożliwia stworzenie gotowych funkcji do naszego zbioru. Treść brzmi dziwnie: wypisać liczby, które w zapisie ósemkowym mają cyfrę występującą dokładnie dwa razy.
Po pierwsze musimy zkonwertować na inny zapis.
string dec2other(int x, int base){ int l=x,t; string napis=""; while (l){ t=l%base; if (t<10) napis=char(t+48)+napis; else napis=char(t+55)+napis; l/=base; } return napis; }
Kod opiera się na dzieleniu modulo i rzutowaniu na znak - dla cyfr większych od 9 potrzeba nam cyfry z hex'a: A,B,C... Warto zauważyć, że należałoby dołożyć jeszcze założenia podobne do tych:
if (base<2) return "---";
oraz w pętli (po bieżącym if /else) w celu obsługi dużych cyfr "po ludzku", a nie kolejnymi w ASCII [, \ ] itd.:
if (t>35) napis="["+t+"] "+napis;
Liczba [54] A567 [36] nie jest zbytnio czytelna. Można zatem zglobalizować zmianę w taki sposób:
bool big = false; if (base>35) big = true; //w pętli: if (big) napis="["+t+"] "; else if (t<10) napis=char(t+48)+napis; else napis=char(t+55)+napis;
Teraz należy sprawdzić warunek z cyframi. Skoro liczba jest już w tablicy znaków (string) to można stworzyć pomocniczą tablicę ilość_występowania(cyfra), a następnie ją sprawdzić pod kątem z treści zadania. Dwie funkcje są alternatywne, ale pierwsza przyjmująca za parametr string obsługuje systemy o ograniczonej podstawie, druga wymaga tablicy kolejnych cyfr. base to podstawa systemu liczenia
bool czy(string napis, int base){ int* tab = new int [base]; for (int i=0; i< base; i++) tab[i]=0; int tmp; for (int i=0; i< napis.length(); i++){ tmp=(int)(napis[i]-48); if (tmp >10) tmp-=7; tab[tmp]++; } for (int i=0; i< base; i++){ //obsługa warunku if (tab[i]==2){ return true; } } return false; } bool czy(int* tab_we, int rozm, int base){ int* tab = new int [base]; for (int i=0; i< base; i++) tab[i]=0; int tmp; for (int i=0; i< rozm; i++){ tab[tab_we[i]]++; } for (int i=0; i< base; i++){ //obsługa warunku if (tab[i]==2){ return true; } } return false; }
Przykładową implementację dla podanego założenia można pobrać zad5.cpp.