Źródłem problemu przez który Twoja funkcja nie zwraca poprawnych wartości jest funkcja "pow()", ponieważ zwraca ona wartość w typie zmiennoprzecinkowym (double), co dalej czasem prowadzi do problemów w dalszym rzutowaniu na inta, ponieważ nasz kochany C++ miewa problemy z zaokrąglaniem liczb zmiennoprzecinkowych. Aby naprawić ten problem, można albo ztablicować kolejne potęgi 10, albo użyć myku, którego ja osobiście używam i moim zdaniem jest o wiele wygodniejszy od używania pow(). Używając mojego podejścia Twoja funkcja wygląda tak:
int na_piatkowy(int l)
{
int cyfry[100],j=0,piatkowo=0;
while (l>0)
{
cyfry[j] = l%5;
l = l/5;
j++;
}
for (int i = j - 1; i >= 0; i--)
{
piatkowo = (piatkowo * 10) + cyfry[i];
}
return piatkowo;
}
W skrócie "tworzymy" końcową liczbę od lewej do prawej, czyli od największych rzędów wielkości do najmniejszych.
Co do pierwszego to kluczem do zrozumienia tego podejścia do zamiany systemu liczbowego, jest zrozumienie reprezentacji liczby w danym systemie liczbowym oraz tego jak "działa" dzielenie liczby przez podstawę danego systemu liczbowego. Weźmy pod lupę liczbę 13 i jej reprezentacje binarną czyli 1101. Na początku ustalmy jedną dosyć oczywistą rzecz, a mianowicie, aby pozyskać wartość ostatniego bitu danej reprezentacji wystarczy użyć działania modulo (liczba modulo podstawa systemu). Wiemy już jak "wyciągnąć" ostatni bit danej liczby, ale teraz chcielibyśmy umieć to robić dla dowolnego bitu liczby. Na ratunek przychodzi nam dzielenie przez podstawę systemu! Gdy podzielimy te przykładowe 13 przez 2 otrzymamy 6, które to w binarnym jest równe 110. Co możemy zauważyć to, to iż dzielenie niejako "ucięło" nam ostatni bit, i jest to prawidłowa obserwacja, gdyż dzielenie liczby (bez reszty) przez podstawę systemu jest adekwatne do usunięcia ostatniego bitu i przesunięciu wszystkich pozostałych na wcześniejsze miejsce (tłumacząc mocno łopatologicznie). No ale co daje nam takie "ucinanie" kolejnych bitów? To raczej oczywiste, skoro ucinamy kolejne bity, to "odsłaniamy" te "głębsze" dzięki czemu możemy je "wyciągnąć" używając działania modulo. Tak więc w wielkim skrócie używając modulo poznajemy wartość ostatniego bitu liczby, a dzielenie umożliwia nam usuwanie ostatniego bitu, bez zmiany kolejnych. Tak więc to co robi znaleziony przez ciebie kod to po prostu "ucinanie" wszystkich możliwych bitów, aż dojdziemy do końca (liczba będzie zerem), a następnie "wyciągamy" wartości bitów dzięki modulo.