Liczby, które w zapisie ósemkowym mają jakąś cyfrę, która występuje dwa razy – zadanie sprawdzianowe
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.